現状の ffmpeg では VTT字幕と、映像と音声のセグメントを合わせたマスタープレイリストを作れないので、マスタープレイリストを編集しなければならない。多くのブラウザがプレイリストの直接再生に対応していないのでライブラリを使う。

ffmpeg で Apple HTTP Live Streaming(HLS)を扱う

準備

HTML5 プレイヤの例

ffmpeg で HLS 出力するときに注意する点はいくつかあり、エンコード設定、解像度やフレームレート、ライブかVODか、遅延、視聴環境などそれぞれに対応する必要があるが、今回は試しやすい Windows10 での Edge、firefox、Chrome で再生確認し、配信環境を nginx、ngrok で作っている。

nginx: download
ngrok – secure introspectable tunnels to localhost

ngrok 導入方法 – Qiita
少しでも安全にngrokを使用する(Basic認証) – Qiita

ARIB字幕を変換するには libaribb24 を有効にする。

ARIB字幕をdemuxする libaribb24

Windows 向けには お気に入りの動画を携帯で見よう の配布バイナリが対応している。

コーデックは H.264/AAC を使うので映像コーデックにはソフトウェアエンコード、ハードウェアエンコードそれぞれ配信環境に合わせて使う。AACエンコーダは配布できない FDK-AAC(libfdk-aac)があるので、こちらを試すなら media-autobuild_suite でバイナリを用意する。

通常のARIB字幕付きHLS配信

デュアルモノラルのときだけ音声コーデックを copy すると HLS で再生できない。それ以外はコピーしても再生できる(はず)。

[確認]NHK解説放送のmp4エンコード · Issue #244 · l3tnun/EPGStation

ffmpeg -analyzeduration 10MB -probesize 10MB -fix_sub_duration -i input.ts -vf yadif,scale=1280:720 -c:v libx264 -c:a aac -c:s webvtt -map 0:v -map a:0 -map 0:s -f hls -master_pl_name master.m3u8 -hls_list_size 0 720p.m3u8

一番メジャーなインターレース解除フィルタ yadif
リサイズする scale

これで出力されるプレイリストが、720p.m3u8、720p.m3u8 を参照する master.m3u8、720p_vtt.m3u8 になる。ただし master.m3u8 は sub_vtt.m3u8 を参照してないので以下のように書き換える。

書き換え前。

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:BANDWIDTH=140800,RESOLUTION=1280x720,CODECS="avc1.64001f,mp4a.40.2"
720p.m3u8

書き換え後。

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="sub",NAME="Japanese",DEFAULT=YES,AUTOSELECT=NO,FORCED=NO,LANGUAGE="jp",URI="720p_vtt.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=140800,RESOLUTION=1280x720,SUBTITLES="sub"
720p.m3u8

BANDWIDTH タグはビットレートの目安となり、DEFAULT, AUTOSELECT, FORCED タグは字幕の表示設定に関わる。GROUP-ID タグで指定したものを SUBTITLES タグで指定することでそのストリームに字幕を載せることができる。

VTT字幕付きで再生するには hls.js を使う。HLSを使って重い動画をWEBサイトに実装する – Qiita を参考に、html ファイルを作成して、hls.loadSource 内のプレイリストを master.m3u8 に変更する。参照している(https://cdn.jsdelivr.net/npm/hls.js@latest)は Releases · video-dev/hls.js の hls.min.js と同じである。

これで最初から字幕付きのHLSで再生できる。最初から字幕を非表示にするには DEFAULT, AUTOSELECT, FORCED を無指定にしておく。

映像と音声のプレイリストと字幕のプレイリストを出力し、マスタープレイリストを出力せずに自作するコマンド例。マスタープレイリストは上と同じ。
ffmpeg -analyzeduration 10MB -probesize 10MB -fix_sub_duration -i input.ts -vf yadif,scale=1280:720 -c:v libx264 -c:a aac -c:s webvtt -map 0:v -map 0:a -map 0:s -f hls -hls_list_size 0 720p.m3u8

fmp4 に変更する

上のコマンド例に -hls_segment_type 1 を追加する。
ffmpeg -analyzeduration 10MB -probesize 10MB -fix_sub_duration -i input.ts -vf yadif,scale=1280:720 -c:v libx264 -c:a aac -c:s webvtt -map 0:v -map a:0 -map 0:s -f hls -master_pl_name master.m3u8 -hls_list_size 0 -hls_segment_type 1 720p.m3u8

ffmpeg -analyzeduration 10MB -probesize 10MB -fix_sub_duration -i input.ts -vf yadif,scale=1280:720 -c:v libx264 -c:a aac -c:s webvtt -map 0:v -map 0:a -map 0:s -f hls -hls_list_size 0 -hls_segment_type 1 720p.m3u8

書き換え後。#EXT-X-VERSION:7 にする。

#EXTM3U
#EXT-X-VERSION:7
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="sub",NAME="Japanese",DEFAULT=YES,AUTOSELECT=NO,FORCED=NO,LANGUAGE="jp",URI="720p_vtt.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=140800,RESOLUTION=1280x720,SUBTITLES="sub"
720p.m3u8

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)