これでやろうとすること
録画完了時のslack通知をリッチにします。
録画ファイルのエンコード完了時、エンコード完了時のメッセージと同時に録画ファイルの画面キャプチャもslackに通知する。
画面イメージ
こんな画面イメージで通知されます。録画した番組の概要を画像からもわかるようになると思います。
エンコードした動画ファイルの30秒後の画像を切り取って、拡張子にjpgを付与して画像ファイルにしています。
これがiPhoneで参照できる画面。
そして、これがパソコンで参照できる画面。
シェルの変更
/usr/local/bin/recordedEnc.sh
を変更しました
変更前
#!/bin/sh dir_output="/recorder" outfile=${1%.*}.mp4 mp4file=${outfile##*/} sec=`awk "BEGIN{srand(); print int(rand()*100)%59+1;}"` until [ ! `pidof -s ffmpeg` ] do sleep ${sec} done /usr/local/bin/slack ${dir_output}/${mp4file}.jpg exit 0
変更後
2行を追加して、以下のように変更しました。
#!/bin/sh dir_output="/recorder" outfile=${1%.*}.mp4 mp4file=${outfile##*/} sec=`awk "BEGIN{srand(); print int(rand()*100)%59+1;}"` until [ ! `pidof -s ffmpeg` ] do sleep ${sec} done /usr/local/bin/ts2enc.pl "$1" "${dir_output}/${mp4file}" > /dev/null 2>&1 /home/chinachu/chinachu/usr/bin/ffmpeg -y -i "${dir_output}/${mp4file}" -ss 30 -t 1 -r 1 -s 1280x720 "${dir_output}/${mp4file}.jpg" > /dev/null 2>&1 /usr/local/bin/slack ${dir_output}/${mp4file}.jpg exit 0
追加した行についての説明。
ffmpegで使用しているオプションは以下です。
- -y : 同一ファイル名があってもファイルを上書きする
- -i : インプットとなる動画ファイルを指定する
- -ss : 動画ファイルでキャプチャする開始時間を指定する
- -t : 開始時間からのキャプチャする秒数を指定する
- -r : キャプチャする画像ファイルの枚数を指定する
- -s : キャプチャする画像ファイルのサイズを指定する
また、追加した2行目の'''/usr/local/bin/slack'''はgolangで作成したバイナリを指定しています。
バイナリを作るためのglangのソースコードは以下です。
package main import ( "flag" "os" "github.com/nlopes/slack" ) var ( slackAPIToken = "YOUR SLACK API TOKEN" slackChannel = "YOUR SLACK CHANNELE" args string ) func main() { flag.Parse() args := flag.Arg(0) if err := postText(args, slackAPIToken, slackChannel); err != nil { panic(err) } if err := postImage(args, slackAPIToken, slackChannel); err != nil { panic(err) } } func postImage(args, slackAPIToken, slackChannel string) error { file, err := os.Open(args) if err != nil { return err } api := slack.New(slackAPIToken) _, err = api.UploadFile( slack.FileUploadParameters{ Reader: file, Title: args, Filename: "upload file name", Channels: []string{slackChannel}, }) return err } func postText(args, slackAPIToken, slackChannel string) error { text := "録画番組のエンコード完了:" + args api := slack.New(slackAPIToken) _, _, err := api.PostMessage( slackChannel, slack.MsgOptionText(text, false)) return err }
やろうと思ってできなかったこと
シェルでgo run slack.go
のようにしてgolangを動かせると思っていたのですが、なぜかできなかったです。
なんとなく、シェルを動かすユーザとgolangをコンパイル、起動するユーザが異なるのが原因なのかとは予想するのですが。
バイナリがあれば動くので、まずはこれでOKとしています。
さらにやりたいこと
動画の開始30秒を指定しています。ただ、これだとそのタイミングがたまたまCMだったりすることもあるので、できれば動画のハイライト部分を自動で抽出するようにしたいです。
AIとか、そういうのが必要なのかな。。。