MP4ビデオから字幕を抽出する方法には、ffmpegを使う方法と、mp4boxを使う方法があります。ffmpegを使う方法が簡単です。

ffmpegを使う方法 *

まずは、ffmpegを使う方法から。後述のmp4boxだとトラック番号を調べる必要があるので、こちらの方が簡単です。まずは、ffmpegのインストール方法から。macOSであれば、Homebrewを使ってインストールできます。

$ brew install ffmpeg

ffmpegで字幕データ(srt)を抽出する方法:

[書式]
$ffmpeg -i (動画.mp4) (出力ファイル.srt)

テキストファイルで「出力ファイル.srt」を開くと、生のSRT(SubRip)形式のデータファイルを得ることができます。

ffmpeg+独自スクリプト *

しかし、生のsrtファイルは読みにくいので、人間の読みやすく整形して出力するスクリプトを、なでしこ3で作りました。前提として、Node.jsがインストールされている必要がありますが、以下のようにしてなでしこ3をインストールします。

# なでしこ3のインストール
$ npm -g install nadesiko3
# ffmpegのインストール
$ brew install ffmpeg

その上で、以下のスクリプトを、jimaku.nako3という名前で保存して、実行権限をつけます。

#!/usr/bin/env cnako3
もし、コマンドラインの要素数が3以下ならば
  「jimaku.nako3 (動画ファイル)」と表示。終わる。
ここまで
MP4 = コマンドライン[3]
FSRT=MP4の「\.\w+$」を「.srt」に正規表現置換。
FOUT=MP4の「\.\w+$」を「.txt」に正規表現置換。
「ffmpeg -i "{MP4}" "{FSRT}"」を起動。
S=FSRTを開く
結果=空
Sを改行&改行で区切って反復
    N=それをトリム
    もし、N=空ならば、続ける
    J=(N&改行&改行&改行)を改行で区切る
    NO=J[0]
    TIME=J[1]
    BODY=J[2]&J[3]&J[4]
    TIME=TIMEの「^(\d+\:\d+:\d+).*」を「$1」で正規表現置換。
    BODY=BODYの「(\r|\n)」を「」に正規表現置換。
    BODY=BODYの「</font>」を「」に置換。
    BODY=BODYの「<font.*?>」を「」に正規表現置換。
    BODY=BODYの『{\an7}』を空に置換。
    R=「{TIME}> {BODY}」
    結果=結果&R&改行
ここまで
結果をFOUTへ保存。
「OK」と表示。

そして、以下のようにして、コマンドを実行すると、人間の目に読みやすい字幕ファイルを生成します。

$ ./jimaku.nako3 (動画ファイル.mp4)

出力されるテキストの例:

...
00:04:22>ヨブ記を読んでくださりじっと耳を傾けました
00:04:28>何度も読んできましたがその時は違っていました
00:04:32>話が心に深くしみました
...

mp4boxを使う方法 *

また、多少面倒ですが「mp4box」を使うと、MP4ビデオから字幕を抽出することができます。macならHomebrewでインストールできます。

$ brew install mp4box

使い方ですが、まず、動画の情報を確認します。

$ mp4box -info (動画ファイル.mp4)

すると、各トラックにどんなデータがあるのかが表示されます。そこで、字幕があるっぽいトラックの番号を調べます。

続いて、以下のコマンドを実行すると、字幕をファイルへ抽出できます。

$ mp4box -srt (トラック番号) (動画ファイル.mp4)

出力ファイル名は、「(動画ファイル名)_(トラック番号)_text.srt」という名前になっています。

これをテキストエディタで開くと、

1
00:00:00,000 --> 00:00:05,138
なんとかかんとか

2
00:00:05,138 --> 00:00:08,181
なんとかかんとか
...

という感じのデータとなっています。