web-dev-qa-db-ja.com

M3U8をMKVに変換するときに、HLSセグメントからチャプターを作成するにはどうすればよいですか?

Ffmpegを使用して、数十のセグメントを持つ既存のM3U8をMKVに変換しています。

ffmpeg -i http://example.com/foo.m3u8 -c copy foo.mkv

FFMpegはM3U8にリストされているセグメントを接着しており、結果はモノリシックMKVです...誰かがすでにオリジナルをパーツに分割する問題を経験しているので、結果のMKVに情報を保持して作成したいと思います各セグメントの章。 ffmpegにそれを記録するように頼むことはできますか?


以下のコメントで要求されたffmpeg -iの出力は次のとおりです。

% ffmpeg -i Marie-Octobre.m3u8 
ffmpeg version 3.2.2 Copyright (c) 2000-2016 the FFmpeg developers
  built with FreeBSD clang version 3.4.1 (tags/RELEASE_34/dot1-final 208032) 20140512
  configuration: --prefix=/opt --mandir=/opt/man --datadir=/opt/share/ffmpeg --pkgconfigdir=/opt/libdata/pkgconfig --enable-shared --enable-gpl --enable-postproc --enable-avfilter --enable-avresample --enable-pthreads --cc=cc --disable-indev=alsa --disable-outdev=alsa --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libass --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcelt --disable-chromaprint --enable-libdc1394 --disable-debug --disable-htmlpages --disable-libebur128 --enable-libfdk-aac --enable-ffserver --enable-libflite --enable-fontconfig --enable-libfreetype --enable-frei0r --enable-libfribidi --enable-libgme --enable-libgsm --enable-iconv --enable-libilbc --disable-indev=jack --enable-libkvazaar --enable-ladspa --enable-libmp3lame --enable-libbluray --enable-mmx --enable-libmodplug --enable-netcdf --enable-openal --enable-opencl --enable-libopencv --enable-opengl --enable-libopenh264 --enable-libopenjpeg --enable-libopus --disable-libpulse --disable-indev=Pulse --disable-outdev=Pulse --enable-runtime-cpudetect --enable-librubberband --enable-libschroedinger --enable-ffplay --disable-libsmbclient --enable-libsnappy --disable-indev=sndio --disable-outdev=sndio --disable-libsoxr --enable-libspeex --enable-sse --disable-libssh --disable-libtesseract --enable-libtheora --enable-libtwolame --disable-libv4l2 --disable-indev=v4l2 --disable-outdev=v4l2 --enable-vaapi --enable-vdpau --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libvpx --enable-libwavpack --enable-libwebp --enable-x11grab --enable-libx264 --enable-libx265 --enable-libxcb --enable-libxvid --enable-libzimg --enable-libzmq --disable-libzvbi --disable-gcrypt --disable-gmp --enable-librtmp --disable-gnutls --enable-openssl --enable-version3 --enable-nonfree
  libavutil      55. 34.100 / 55. 34.100
  libavcodec     57. 64.101 / 57. 64.101
  libavformat    57. 56.100 / 57. 56.100
  libavdevice    57.  1.100 / 57.  1.100
  libavfilter     6. 65.100 /  6. 65.100
  libavresample   3.  1.  0 /  3.  1.  0
  libswscale      4.  2.100 /  4.  2.100
  libswresample   2.  3.100 /  2.  3.100
  libpostproc    54.  1.100 / 54.  1.100
Input #0, hls,applehttp, from 'Marie-Octobre.m3u8':
  Duration: 01:34:35.48, start: 0.101000, bitrate: 0 kb/s
  Program 0 
    Metadata:
      variant_bitrate : 0
    Stream #0:0: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p(tv, smpte170m/smpte170m/bt709), 640x384, 25 fps, 25 tbr, 90k tbn, 180k tbc
    Metadata:
      variant_bitrate : 0
    Stream #0:1: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp
    Metadata:
      variant_bitrate : 0
    Stream #0:2: Data: timed_id3 (ID3  / 0x20334449)
    Metadata:
      variant_bitrate : 0
At least one output file must be specified

実際のM38Uファイルには、次のようなセグメントのスコアがリストされています。

#EXTM3U
#EXT-X-TARGETDURATION:24
#EXT-X-ALLOW-CACHE:YES
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:1
#EXTINF:16.000,
seg-1-v1-a1.ts
#EXTINF:16.000,
seg-2-v1-a1.ts
#EXTINF:24.000,
seg-3-v1-a1.ts
#EXTINF:24.000,
seg-4-v1-a1.ts
#EXTINF:24.000,
...

結果のMKVの各セグメントを「章」にしたいと思います...

1
Mikhail T.

あなたが参照しているのはHLSセグメントであり、M3U8ストリームが指定する実際のチャプターではないため、ffmpeg自体はそれを行うことができません。 ffmpegはストリームを解析し、単一のビデオストリームとして表示します。だから、あなたがする必要があるのは:

  • M3U8ファイルを解析します
  • MKVチャプターフォーマット仕様に従って独自のチャプターリストを作成する
  • mkvmergeを使用して、ffmpegが生成したMKVファイルにこれらのチャプターを追加します

具体的には、M3U8を解析し、すべてのセグメント長(EXTINFで指定)とその名前を抽出します。

#EXTINF:16.000,
seg-1-v1-a1.ts
#EXTINF:16.000,
seg-2-v1-a1.ts
#EXTINF:24.000,
seg-3-v1-a1.ts
#EXTINF:24.000,
seg-4-v1-a1.ts
#EXTINF:24.000,

次に、セグメントごとに、開始を累積セグメント期間に設定し、名前をセグメント名に設定して、新しいチャプターを作成します。

CHAPTER01=00:00:00.000
CHAPTER01NAME=seg-1-v1-a1.ts
CHAPTER02=00:00:16.000
CHAPTER02NAME=seg-2-v1-a1.ts
CHAPTER03=00:00:32.000
CHAPTER03NAME=seg-3-v1-a1.ts
CHAPTER04=00:00:56.000
CHAPTER04NAME=seg-4-v1-a1.ts
...

これは、BashスクリプトまたはPythonを使用して、最適なプログラミング言語で実行できます。 (今はスクリプトを書く時間がありませんが、あなたはその考えを理解しています。)

そのファイルをchapters.txtとして保存します。

次に、 mkvtoolnix をインストールして実行します。

mkvmerge input.mkv --chapters chapters.txt -o output.mkv
1
slhck