web-dev-qa-db-ja.com

ffmpegを使用してMP4ビデオからSubRip(SRT)字幕を抽出することは可能ですか?

私はFFMpegのドキュメントと多くのフォーラムをチェックし、.MP4ビデオから字幕を抽出するための正しいコマンドラインを次のように理解しました。

ffmpeg -i video.mp4 -vn -an -codec:s:0 srt out.srt

ただし、次のエラーが発生します。これは、これが実行可能かどうかを疑問視するのに役立ちます。

出力ストリーム#0:0のエンコーダーを開いているときにエラーが発生しました-bit_rate、rate、width、heightなどのパラメーターが正しくない可能性があります

ffmpeg -codecsを使用して、ffmpegがサブリップ字幕をエンコードできるはずであることを確認できます。

ffmpeg -i video.mp4を使用すると、ビデオに2つの字幕トラックが埋め込まれていることがわかります。

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'video.mp4':
...
Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 720x572 [SAR 64:45 DAR 256:143], 1341 kb/s, 25 fps, 25 tbr, 90k tbn, 180k tbc
Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 191 kb/s
Stream #0:2(fra): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 191 kb/s
Stream #0:3(eng): Subtitle: dvd_subtitle (mp4s / 0x7334706D)
Stream #0:4(und): Subtitle: mov_text (text / 0x74786574)

[〜#〜]編集[〜#〜]

コメントに示されている簡略化されたコマンドラインでテストしましたが、それでも同じエラーが発生します。これが 詳細な詳​​細出力へのリンク コマンドの実行からです。また、結果の出力でメタデータとチャプターを完全に無効にしようとしましたが、それでも同じエラーが発生します。

11
Maxime Labelle

私は、なぜ成功しなかったのかを思い切って理解しました。

ソースビデオの字幕がテキストベースの表現でエンコードされていれば、指定されたコマンドラインは完全に問題ありませんでした。ただし、ffmpeg -iコマンドラインへの出力に見られるように、字幕は「dvd_subtitle」形式でエンコードされます。

Dvd_subtitle形式は、ビデオの各字幕のビットマップを格納します。したがって、ffmpegがビットマップをテキストに変換できる方法はありません。

このタスクでは、ビットマップ表現から各字幕をテキストとして識別するタスクでユーザーを支援するOCRベースのソフトウェアに頼る必要があります。

(ソースビデオにはセカンダリテキストベースの字幕がありますが、それがどこから来たのかわからず、ほとんどの人気のあるプレーヤーには見られません。すべての意図と目的のために、この「mov_text」字幕はスタブプレースホルダーのようです、おそらく元のDVDからの変換のアーティファクト)

22
Maxime Labelle

参考までに(まだ担当者のためコメントできません)、MP4からSRTを抽出すると、ファイルは通常のSRTではなくMOV_Textとしてフォーマットされます。それはまだ追加されて動作しますが、mp4をm4vに変更するようなものです。通常は機能しますが、コード内では同じようには機能しません。 Mov_textは、フォントやサイズなどを手動で調整するのは恐ろしいことです。最善の策は、WebからSRTをダウンロードしてテストすることです。

これは機能しますが、mov_textでコード化されたsrtファイルになります。

ffmpeg -i in.mp4 out.srt
4

マップオプションを使用してみてください...入力ファイルにストリームが多すぎる場合...

構文は次のようになります。

ffmpeg -i video.mp4 -map :4 out.srt

ビデオには2つの字幕ストリームがあるため、最初はdvdsubtitleである0:3でsrtに変換できないため、mov_textで字幕のソフトコピーであるため簡単に変換できる0:4ストリームで2番目の字幕を変換します。 .。。

2