有馬総一郎のブログ

(彼氏の事情)

2024年01月23日 14:10:30 JST - 4 minute read - Linux

Blu-rayの動画(m2ts)をFFmpegを使って分秒(チャプター)で分割する

保護されてない Blu-rayに格納されたm2tsをチャプター毎に分割したい。出来れば無劣化で。

もう、ffmpegについてはありとあらゆるサイトがあるのが、以下を参考にした。

まずはチャプター毎に分割したいので BDInfoで、以下のようなチャプター情報を抽出する。

FILES:

Name            Time In         Length          Size            Total Bitrate   
----            -------         ------          ----            -------------   
00000.M2TS      0:00:00.000     2:43:25.295     0               0               

CHAPTERS:

Number          Time In         Length          Avg Video Rate  Max 1-Sec Rate  Max 1-Sec Time  Max 5-Sec Rate  Max 5-Sec Time  Max 10Sec Rate  Max 10Sec Time  Avg Frame Size  Max Frame Size  Max Frame Time  
------          -------         ------          --------------  --------------  --------------  --------------  --------------  --------------  --------------  --------------  --------------  --------------  
1               0:00:00.000     0:03:31.444     0 kbps          0 kbps          00:00:00.000    0 kbps          00:00:00.000    0 kbps          00:00:00.000    0 bytes         0 bytes         00:00:00.000    
・・・中略・・・

これで、分割する時分秒が分かるので-ssでトリミングの開始位置、-tで開始位置からの時間の長さを指定すれば良い。ミリ秒単位で指定できるのか不安だったが、以下のサイトにあるとおり、可能だった。

無劣化で分割したければ-c copyを付ければ良い。分割にかかる時間やCPUの使用率を見る感じ、再エンコードなどされずに済んでいるようだ。

ffmpeg -i /mnt/iso/BDMV/STREAM/00000.m2ts -ss 2:36:07.124 -t 0:07:18.171 -c copy /home/arimasou16/Videos/bd01.m2ts

ただ、何故か分割されたファイルを再生するとジィーとホワイトノイズが入ってしまう。なので、音声だけエンコードする。-c:v copyとすれば動画は無劣化となる。

ffmpeg -i /mnt/iso/BDMV/STREAM/00000.m2ts -ss 0:00:00.000 -t 0:03:31.444 -c:v copy -c:a aac -b:a 320k /home/arimasou16/Videos/bd01_320.mp4

ただ、やはり、これだとファイル容量が大きいので、- ffmpegで動画をH.265エンコードして容量を大幅に節約する - 丁寧に手を抜くを参考にH.265でエンコードする。

Apple標準と互換性を持たせるために-tag:v hvc11を付与する。

ffmpeg -i /mnt/iso/BDMV/STREAM/00000.m2ts -ss 0:00:00.000 -t 0:03:31.444 -c:v libx265 -tag:v hvc1 /home/arimasou16/Videos/bd01_iphone.mp4

ただ、HEVC/H.265ビデオフォーマットは HEVC/H.265 video format | Can I use… Support tables for HTML5, CSS3, etcにあるとおり、全ブラウザと互換性があるわけではない。Apple製は別とし、WindowsやAndroidではハードウェアサポートによる一部な互換性となる。

ということで、オープンソースでロイヤリティフリーのビデオコーデックとして Encode/AV1 – FFmpegがあるのだけど、配布されているffmpegは、著作権的な問題なのか、 SVT-AV1のコーデックlibsvtav1を有効にしていない。

$ ffmpeg -i "/media/arimasou16/CDROM/BDMV/STREAM/00000.m2ts" -ss 0:00:00.000 -t 0:03:31.444 -c:v librav1e "/mnt/hdd1/My Videos/新体操/output/output01.mp4" 
Unknown encoder 'librav1e'
$ ffmpeg -help encoder=libsvtav1
ffmpeg version 4.4.2-0ubuntu0.22.04.1 Copyright (c) 2000-2021 the FFmpeg developers
  built with gcc 11 (Ubuntu 11.2.0-19ubuntu1)
  configuration: --prefix=/usr --extra-version=0ubuntu0.22.04.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-pocketsphinx --enable-librsvg --enable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
  libavutil      56. 70.100 / 56. 70.100
  libavcodec     58.134.100 / 58.134.100
  libavformat    58. 76.100 / 58. 76.100
  libavdevice    58. 13.100 / 58. 13.100
  libavfilter     7.110.100 /  7.110.100
  libswscale      5.  9.100 /  5.  9.100
  libswresample   3.  9.100 /  3.  9.100
  libpostproc    55.  9.100 / 55.  9.100
Codec 'libsvtav1' is not recognized by FFmpeg.

libaom-av12は有効になっていたので、試したら劇遅で、とても実用に耐えれるレベルではない。

ffmpeg -i "/media/arimasou16/CDROM/BDMV/STREAM/00000.m2ts" -ss 0:00:00.000 -t 0:03:31.444 -c:v libaom-av1 -strict -2 /home/arimasou16/Videos/bd01_av1.mp4

なので、 AV1全部盛りFFmpegのビルド (2021年6月版) - 鴨川のはりねずみのように、 CompilationGuide/Ubuntu – FFmpegを参考に、頑張って--enable-libsvtav1にしてビルドするしかないのかなぁ。

私は面倒というか環境が汚れるのが嫌で3、試していない。 libsvtav1を使ったらffmpegでのAV1エンコードが超高速になった話 | nexryai.logを見ると

ArchやDebianの公式リポジトリでも有効

とあるけど、どいうことだろう?気が向いたらビルドしてみる。以上。


  1. Encode/H.265 – FFmpeg ↩︎

  2. 実験的なコーデックを使う場合、-strict -2が必要となる。 ↩︎

  3. とは建前で、ビルド失敗時に解決する能力が足りていない。だからflatpakでインストールできるアプリを好んでる。 ↩︎