ffmpegの字幕の焼き付けエンコードが遅いのでビルド元を変えたらoverlayフィルタが速くなったが理由が判らない
BMS2を使ってテレビでDLNA視聴するとき、字幕を焼き付けてトランスコードをしたいです。字幕の焼き付けにffmpegを使っています。前回記事に書いたようにフルHD映像だと30fpsのトランスコード速度が出ず実質使えない状態です。
試しにffmpegを異なるビルド元で試してみたらトランスコード速度がだいぶ上がりました。
私が使っているffmpegは いね様の"FFMpegビルド用オールインワンツール"を使ってビルドしたものです。前回記事でのffmpegバージョンはN-53348-gc88e52eでした。できるだけリビルドをし最新版を使うようにしています。
このツールではフォントを扱うlibfreetypeが有効に設定されていないためテキスト字幕の焼き付けができません。ツールのどこを修正すればlibfreetypeが有効になるか解らないため、ffmpegのwindowsビルドを配布しているZeranoe FFmpegの64bit版を使ってみる事にしました。ダウンロードしたバージョンはN-53616-g7a2edcfでした。
そして、前回記事と同じコマンドを実行してエンコード速度に変化があるか確認してみました。
前回のバージョンの結果は、
今回のバージョンで試すと、
もう一回同じコマンドを実行すると、
何が起きてるんでしょうか。さらにもう一回と何回かやっていると35fps程度と48fps程度が規則性もなく現れます。遅い時はずーっと遅いままトランスコードをします。速い時は速いまま。OSのキャッシュの影響には見えません。なんでこんなにパフォーマンスが異なるのでしょうか?
また、"FFMpegビルド用オールインワンツール"でのビルドと何が違うのでしょうか?
libavfilterのバージョンが異なっていたので、ビルドツールでリビルドしてみました。するとバージョンはN-53647-g29e97cdとなりました。確実に新しいバージョンです。
早速これで同じコマンドを試すと・・・遅いです。30fps出ません。
きっと64bit版が速いのか? と思い32ビット版をダウンロードして試してみたら64ビット版並の速度がでました。
何かコンパイルオプションが違うのでしょうか?今後気が向いたら自力ビルドに挑戦したいと思います。
当面はZeranoe FFmpegのビルドを使っていこうと思います。このビルドではaac関係のライブラリが含まれませんので標準のAACエンコーダしか使えません。保存目的ではなくトランスコード目的なら少し音が悪くても気にする必要は無いと思っています。それにREGZAではAAC音声をうまく再生できていないのでAC3だけ動けば良いと思います。
と、書いてる途中で不具合が。BMS2のトランスコード中、ffmpegのプロセスが終了しません。Zeranoe FFmpegのビルドではプレビューを表示する都度、あるいはトランスコード再生中に30秒スキップする都度にffmpegプロセスが増えていきます。そのプロセスがCPUを使ってしまうのでそのうち再生がカクカクになります。
ビルドツールで作った新しいffmpegも似た症状がでます。こちらもプロセスが残ってしまいます。しかし、CPUは使わず0%となるため見た目の再生動作は問題なく行われます。気づかず使っているとffmpegのプロセスがいくらでも増殖します。
以前のビルドN-53348-gc88e52eではこの問題は起こりません。しばらく最新ビルドは様子を見る必要がありそうです。
試しにffmpegを異なるビルド元で試してみたらトランスコード速度がだいぶ上がりました。
私が使っているffmpegは いね様の"FFMpegビルド用オールインワンツール"を使ってビルドしたものです。前回記事でのffmpegバージョンはN-53348-gc88e52eでした。できるだけリビルドをし最新版を使うようにしています。
このツールではフォントを扱うlibfreetypeが有効に設定されていないためテキスト字幕の焼き付けができません。ツールのどこを修正すればlibfreetypeが有効になるか解らないため、ffmpegのwindowsビルドを配布しているZeranoe FFmpegの64bit版を使ってみる事にしました。ダウンロードしたバージョンはN-53616-g7a2edcfでした。
そして、前回記事と同じコマンドを実行してエンコード速度に変化があるか確認してみました。
ffmpeg -ss 00:10:30 -i TEST1.mkv -threads 4 -filter_complex "[0:v:0][0:s:0]overlay" -c:v mpeg2video -r 30000/1001 -c:a ac3 -async 1000 -map 0:v:0 -map 0:a:0 -map 0:a:1 -streamid 0:33 -streamid 1:34 -streamid 2:35 -f mpegts -y a.ts
前回のバージョンの結果は、
frame= 103 fps= 29 q=31.0 size= 1122kB time=00:00:03.67 bitrate=2501.6kbits/ frame= 117 fps= 28 q=31.0 size= 1237kB time=00:00:04.12 bitrate=2458.1kbits/ frame= 133 fps= 29 q=31.0 size= 1361kB time=00:00:04.57 bitrate=2439.3kbits/ frame= 147 fps= 28 q=31.0 size= 1538kB time=00:00:05.17 bitrate=2433.2kbits/でした。
今回のバージョンで試すと、
frame= 108 fps= 35 q=31.0 size= 1142kB time=00:00:03.83 bitrate=2438.8kbits/ frame= 126 fps= 35 q=31.0 size= 1331kB time=00:00:04.37 bitrate=2489.6kbits/ frame= 142 fps= 35 q=31.0 size= 1455kB time=00:00:04.95 bitrate=2406.3kbits/ frame= 160 fps= 35 q=31.0 size= 1650kB time=00:00:05.56 bitrate=2429.9kbits/となります。35fps 、おっ! 速くなってる!
もう一回同じコマンドを実行すると、
frame= 98 fps= 48 q=24.8 size= 1108kB time=00:00:03.48 bitrate=2605.4kbits/ frame= 122 fps= 48 q=24.8 size= 1319kB time=00:00:04.21 bitrate=2561.5kbits/ frame= 150 fps= 49 q=31.0 size= 1549kB time=00:00:05.17 bitrate=2449.7kbits/ frame= 178 fps= 50 q=31.0 size= 1773kB time=00:00:06.17 bitrate=2354.0kbits/48fps! さらに速いんですけど・・・
何が起きてるんでしょうか。さらにもう一回と何回かやっていると35fps程度と48fps程度が規則性もなく現れます。遅い時はずーっと遅いままトランスコードをします。速い時は速いまま。OSのキャッシュの影響には見えません。なんでこんなにパフォーマンスが異なるのでしょうか?
また、"FFMpegビルド用オールインワンツール"でのビルドと何が違うのでしょうか?
libavfilterのバージョンが異なっていたので、ビルドツールでリビルドしてみました。するとバージョンはN-53647-g29e97cdとなりました。確実に新しいバージョンです。
早速これで同じコマンドを試すと・・・遅いです。30fps出ません。
きっと64bit版が速いのか? と思い32ビット版をダウンロードして試してみたら64ビット版並の速度がでました。
何かコンパイルオプションが違うのでしょうか?今後気が向いたら自力ビルドに挑戦したいと思います。
当面はZeranoe FFmpegのビルドを使っていこうと思います。このビルドではaac関係のライブラリが含まれませんので標準のAACエンコーダしか使えません。保存目的ではなくトランスコード目的なら少し音が悪くても気にする必要は無いと思っています。それにREGZAではAAC音声をうまく再生できていないのでAC3だけ動けば良いと思います。
と、書いてる途中で不具合が。BMS2のトランスコード中、ffmpegのプロセスが終了しません。Zeranoe FFmpegのビルドではプレビューを表示する都度、あるいはトランスコード再生中に30秒スキップする都度にffmpegプロセスが増えていきます。そのプロセスがCPUを使ってしまうのでそのうち再生がカクカクになります。
ビルドツールで作った新しいffmpegも似た症状がでます。こちらもプロセスが残ってしまいます。しかし、CPUは使わず0%となるため見た目の再生動作は問題なく行われます。気づかず使っているとffmpegのプロセスがいくらでも増殖します。
以前のビルドN-53348-gc88e52eではこの問題は起こりません。しばらく最新ビルドは様子を見る必要がありそうです。
bmsの不具合報告にも出てましたが
返信削除64bit版ffmpegはプロセスが正常に終了できない不具合があるようですよ
https://code.google.com/p/beer-media-server2/issues/detail?id=13
ありがとうございます。なるほど・・・
返信削除たしか32ビットプロセスから64ビットプロセスはkillできないとか見た覚えがあります。でも32bit版ffmpegでも残ってしまった感じです。
一応BMS2はVersion 2.0.130525の最新版でやっています。
もう一回32bit版で一通り動きを確認してみます。
いね氏のツールではw32threadsを Mr.Zeranoeのビルドではpthreadsを使うビルドになっているようです。これがタスクを終了できない事に関係ありそうです。それと、トランスコード速度が違った原因かもしれません。
削除と、思ったんですがいね氏のツールでビルドし直してもプロセスが残るようになってしまいました・・・。N-53707-gf0b9bd8でした。
削除やはり、しばらく様子見ですかね。
Mr.Zeranoeのビルドを素直に公式安定板のVer.1.2にしてみました。32bit版ならプロセスが残ることは無いです。
削除フルHDの字幕overlayも40fps弱は出るようです。ちょっと30秒スキップ後にBMS2の反応が停まる頻度が上がる感じがします。でもフリーズしてる訳ではないです。
次のffmpegバージョンではフィルタのslice処理が実装されるようなので、それまでこのビルドで試そうと思います。