東京生まれHOUSE MUSIC育ち

悪そうな奴はだいたい友達なの?

Chinachuでエンコード完了後にキャプチャ画像をslackに通知する


スポンサードリンク

f:id:padobure:20190623173928p:plain

これでやろうとすること

録画完了時のslack通知をリッチにします。

録画ファイルのエンコード完了時、エンコード完了時のメッセージと同時に録画ファイルの画面キャプチャもslackに通知する。

画面イメージ

こんな画面イメージで通知されます。録画した番組の概要を画像からもわかるようになると思います。

エンコードした動画ファイルの30秒後の画像を切り取って、拡張子にjpgを付与して画像ファイルにしています。

これがiPhoneで参照できる画面。

f:id:padobure:20190623170952j:plain:w300

そして、これがパソコンで参照できる画面。

f:id:padobure:20190623171051p:plain:w300

シェルの変更

/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とか、そういうのが必要なのかな。。。