rokkonet

PC・Androidソフトウェア・アプリの開発・使い方に関するメモ

副音声付きTV録画tsファイルのmp4へのトランスコード

2023 Oct. 21.
2023 May 02.
2020 May 31.
2020 May 30.

出典

2020年版 デジタル放送録画の圧縮を最適化するFFmpegの使い方 - Simple Life in the digital age

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

https://haruo31.underthetree.jp/2014/11/25/%E5%89%AF%E9%9F%B3%E5%A3%B0%E3%81%AE%E3%81%82%E3%82%8Bm2ts%E3%82%92mp4%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AEffmpeg%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3/

https://centossrv.com/epgrec_una.shtml

EPGStationで使うFFmpeg 4.2.4のオプション設定を考える - Simple Life in the digital age

設定概要
  • 前の番組からの切替部以降をファイルの先頭とするために、tsファイルの先頭4秒間を削除する。
  • "1/0+ 1/0モード(デュアルモノ)"の場合のみ、ffmpegにオプション"-dual_mono_mode main"を指定する。

  EPGStationでは、Mirakurunからの変数AUDIOCOMPONENTTYPEが2の場合がデュアルモノ。

  • ffmpegのpresetオプションには"-preset=veryfast"とする。
  • ffmpegのcrfオプションは、解像度1440×1080の場合はcrf=22、解像度1920×1080の場合はcrf=25がよい。(デフォルト値は23)

ffmpegコマンド

"1/0+ 1/0モード(デュアルモノ)"の場合

> ffmpeg -ss 4 -analyzeduration 10M -probesize 32M -dual_mono_mode main -i INFILE -movflags faststart -map 0 -ignore_unknown -max_muxing_queue_size 1024 -sn -vf $videoFilter -preset veryfast -aspect 16:9 -c:v libx264 -crf 23 -f mp4 -c:a aac -ar 48000 -ab $audioBitrate -ac 2 OUTFILE

videoFilter変数
 縦解像度が720以下なら"yadif"。(ディインターレース設定)
 縦解像度が720超なら"yadif,scale=-2:720"。(ディインターレース設定と共に、高さが720で、幅が自動計算される)

 jsで書けば
  videoHeight = parseInt(process.env.VIDEORESOLUTION, 10)  // 文字列を10進数に変換
  let videoFilter = 'yadif'; // ディインターレース設定
  if (videoHeight > 720) {
      videoFilter += ',scale=-2:720'  // videoFilterの値が'yadif,scale=-2:720'になり、ディインターレース設定設定と共に、高さが720で幅が自動計算される
  }

audioBitrate変数
 縦解像度が720以下なら128k
 縦解像度が720超なら192k'

 jsで書けば
  audioBitrate = videoHeight > 720 ? '192k' : '128k' // 縦解像度に応じた設定


"1/0+ 1/0モード(デュアルモノ)"でない場合

> ffmpeg -ss 4 -analyzeduration 10M -probesize 32M -i INFILE -movflags faststart -map 0 -ignore_unknown -max_muxing_queue_size 1024 -sn -vf $videoFilter -preset veryfast -aspect 16:9 -c:v libx264 -crf 23 -f mp4 -c:a aac -ar 48000 -ab $audioBitrate -ac 2 OUTFILE

videoFilter変数、audioBitrate変数は上記と同じ。
主音声・副音声分離保存エンコード実行例

次の2通りのエンコードでは、左チャンネルから日本語、右チャンネルから英語が聞こえるNHK19時ニュースtsファイルはどちらも左右チャンネル共日本語になった。

$ ffmpeg -i INFILE -acodec aac -filter_complex channelsplit -absf aac_adtstoasc

$ ffmpeg -i INFILE -acodec aac -filter_complex channelsplit[FL][FR] -map 0:v -map [FL] -map [FR] -metadata:s:a:0 language=jpn -metadata:s:a:1 language=eng -absf aac_adtstoasc

下記コマンドでのNHKの「世界のドキュメンタリー」のトランスコードは英語のみになった

$ ffmpeg -dual_mono_mode main -i INFILE OUTFILE

下記コマンドでのNHKの「世界のドキュメンタリー」のトランスコードは英語のみになった

$ ffmpeg -dual_mono_mode sub -i INFILE OUTFILE

下記コマンドでのNHKの「世界のドキュメンタリー」のトランスコードは英語のみになった

ffmpeg -ss 4 -analyzeduration 10M -probesize 32M -i INFILE -movflags faststart -vf yadif,scale=-2:720 -preset veryfast -aspect 16:9 -c:v libx264 -crf 23 -f mp4 -c:a aac -ar 48000 -ab 192k -ac 2 OUTFILE

下記コマンドでのNHKの「世界のドキュメンタリー」のトランスコードは日本語のみになった

ffmpeg -ss 4 -i INFILE -preset veryfast -c:v libx264 -crf 22 -f mp4 -map 0:v -map 0:a:0 -map 0:a:1 -ignore_unknown -sn -dn -metadata:s:a:0 title="Japanese" -metadata:s:a:0 language="jpn" -metadata:s:a:1 title="English" -metadata:s:a:1 language="eng" -c:a aac -strict -2 -ar 48000 -ab 192k -ac 2 -loglevel error OUTFILE

下記コマンドでのNHKの「世界のドキュメンタリー」のトランスコードは日本語のみになった

ffmpeg -ss 4 -y -i INFILE -preset veryfast -c:v libx264 -crf 22 -f mp4 -map 0:v -map 0:a:0 -map 0:a:1 -ignore_unknown -sn -dn -metadata:s:a:0 title=main -metadata:s:a:0 language=jpn -metadata:s:a:1 title=sub -metadata:s:a:1 language=jpn -c:a aac -strict -2 -ar 48000 -ab 192k -ac 2 -loglevel error OUTFILE