EMWUI / EDCB_Material_WebUI

71 stars 18 forks source link

ffmpegのエンコードエラーについて #17

Closed amkzku closed 8 months ago

amkzku commented 4 years ago

環境:

現象:  新調したPCで一式導入してみたらリモート視聴がまた何も映らなくなりました。  砂嵐のままで、タスクマネージャーで見るとEpgDataCap_Bonが起動したら閉じて、また起動したら閉じています。ffmpegは起動したらすぐ閉じちゃいます。

調査:  過去の環境に比べれば、EDCB関連ソフトはあの時のままで、変わったのはOSバージョン、ブラウザのバージョン、ffmpegのバージョンのみでして、とりあえず過去バージョンのブラウザを試しました。ダメでした。エラーメッセージはMEDIA_ERR_SRC_NOT_SUPPORTEDでしたが、詳細をクリックしても新ページでエラーの原因を表示するでなく、またプレーヤーが現れて、しばらくしたらエラー表示になりました。  次はffmpegを過去バージョンに変えてみたが、どこまで過去に遡ればいいかわからず、とりあえず2018年ビルドのバージョン不明のffmpegを試しました。変えたところでリモート視聴が問題なく映りました。  ここで問題解決って言ってもいいですが、もう少し問題の原因に近づいてみたいと思って、さらに調査をしました。  ffmpeg 4.2.2に変えていろいろ模索している中、EMWUIのHttpPublic.iniの[SET]にmp4=1を追加すると、リモート視聴ができちゃいました。しかし[MOVIE]で画質設定を追加すると(-f mp4指定)、映らなくなりました。これはもしかして、encodersの問題じゃないかと見て、いろいろ変えてみましたが(libx264 h264_qsv libvpx libvpx-vp9 libopus libvorbis aac)、失敗ばかりでした。  さすがに頭にきていったん放置しました。冷静になってからffmpegのlogを見ればいいじゃんと気づきました。画質設定に-reportを指定して、logを見たら、このようなものがありました。

Stream mapping: Stream #0:0 -> #0:0 (mpeg2video (native) -> vp9 (libvpx-vp9)) Stream #0:1 -> #0:1 (aac (native) -> opus (libopus)) Stream #0:2 -> #0:2 (? (?) -> webvtt (native)) Decoder (codec arib_caption) not found for input stream #0:2

 これはもしかしなくても、ts streamの中にあった字幕が邪魔になったのでは?と思って、ネットで検索してみたら似たようなissueを見かけたので、「お前は犯人だ!(笑)」って確信しました。犯人(笑)は、いつしかffmpegが地デジの字幕をSubtitle: arib_captionとして認識できるようになって、しかし相応のdecoderは付属されていないので、エラーのままに今に至ったそうです。-f mp4で視聴できたのはmp4だとエラー出力されるがエンコードはできるそうです。  画質設定に-sn指定を追加してみたら、webmもmp4も問題なくリモート視聴できました。これで今回の問題は自分の納得できるレベルで解決できました。

EMWUIの改善点:  以上の調査に踏まえて、お手数ですがTvCastの中にあるデフォルト変換コマンドに-snを追加していただけたら、ほかのユーザーさんは困らなくて済むかと思います。ぜひご検討ください。  また、視聴プレーヤーに字幕オプションを追加したら、ffmpegをこちらのfork ( https://github.com/0p1pp1/ffmpeg ) に変えたらたぶん字幕ありの視聴もできるじゃないかと思います。ご迷惑でなければ、こちらもぜひいつか実現していただけたらと思います。

tsukumijima commented 4 years ago

よそ者ですが一応補足…

FFmpeg 4.2 以降、TS 内に含まれる字幕は今まで bin_data として認識されていたのですが、これが arib_caption という字幕ストリームとして認識されるようになりました。ただし、その変更のおかげで、ARIB 字幕をエンコード先の TS にそのままコピーすることができなくなってしまいました。これは現在の最新版である FFmpeg 4.3.1 でも変わっていません。 また、TS 以外の MP4 や WebM にエンコードする場合は今までは bin_data は切り捨てられていたのですが、正常な字幕として認識されるようになったため、字幕を捨てるかエンコードして MP4 や WebM に組み込むか指定しないとエラーを吐くようになっています。これはおそらく現時点での仕様でしょう。 FFmpeg に libaribb24 を組み込んでビルドすると ARIB 字幕をデコードして srt や ass などの他の形式に変換することができるようにはなりますが、それらの問題は変わらないようです。 TS のエンコードに使う FFmpeg は、状況が改善されるまで 4.1 系を使ったほうが良いように思います。

このあたりに関しては EPGStation の Issue が参考になります。 https://github.com/l3tnun/EPGStation/issues/270 https://github.com/l3tnun/EPGStation/issues/276

また、視聴プレーヤーに字幕オプションを追加したら、ffmpegをこちらのfork ( https://github.com/0p1pp1/ffmpeg ) に変えたらたぶん字幕ありの視聴もできるじゃないかと思います。

できなくはありませんが、今の視聴方式では難しいでしょう。 まず、TS に字幕を組み込んだとして、ブラウザはそれを読み込んで表示してはくれません。何らかの形で映像から Media Source Extensions API を利用して字幕を取り出せればよいですが、その実装には高度な知識を要します。 EMWUI はプログレッシブダウンロードでライブ配信しているようです。エンコード中に字幕を .vtt ファイルに書き出したとして、内容がリアルタイムで更新される字幕ファイルをどのように随時取得し映像に同期させて表示するかは悩みものです。

私が開発している TVRemotePlus では HLS という配信形式を利用し、さらに予めエンコード後の TS にコピーした ARIB 字幕をブラウザ上で表示することができる b24.js という JavaScript ライブラリを利用してブラウザ上で字幕を表示する事ができていますが、前述の通り FFmpeg 4.2 以降は ARIB 字幕をエンコード先の TS にそのままコピーすることができなくなっているため、4.1 系の最新版である FFmpeg 4.1.6 を利用しています。

b24.js も、ブラウザの字幕機能が貧弱な事が原因で、今のところ字幕は常に中央揃えで表示され、位置やルビは反映されません。 少なくとも、そう簡単に実現できる機能ではないというのが実情です。