ffprobe+ts2aacでTSファイル内の音声をすべて分離する。

知る人ぞ知る自動エンコードの話。副音声を削除してエンコードするのが主流のようだけども、自分は両方ともデータを維持したままエンコードしたいと思った。

PIDを出力するアプリケーションは多くありましたが、それが動画のPIDなのか、それとも音声のPIDなのか区別のつかないものが多かったです。その中で、最も簡単にTSの構造を出力してくれたものがffprobeでした。(ffmpegに同梱しているやつです。)例えば、あるtsファイルを入力したときには、ffprobeはこのような結果を表示します。

~結果の抜粋~

Stream #0:0[0x100]: Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), …(省略)
Stream #0:1[0x110]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 192 kb/s



これを使えば、音声と動画のPIDをそれぞれ出力することができます。後はts2aacでPID指定をして分離すれば音声の分離が可能になるはずです。あとは、

"ts2aac.exe" -i "入力ファイル" -o "出力ファイル名" -v "動画のPID" -a "音声のPID" -B


として出力すればtsファイルから音声をすべて出力できます。(DGIndex用の指定を行わない場合、-Bオプションは消してください。)

しかし、これを大量にするのは面倒なので、バッチファイルを作成しました。このバッチを使うと、分離された音声ファイルと音声のPID、動画のPIDが格納されたテキストが出力されます。

使用方法:
ffprobeとts2aacのexeファイルを同じフォルダに入れる。
aacdemux.png
下記のプログラムファイル:aac_demux.bat
@echo off
::フォルダ移動
cd /d %~dp0

::ループ処理
:loop
if %1=="" goto end

::ffprobeによるpid出力
"ffprobe.exe" "%~1" > "output1.txt" 2>&1

::Audio一覧を取得
findstr "Audio:" "output1.txt" >> "temp_a2.txt"
::Video情報の取得
findstr "Video:" "output1.txt" >> "temp_v2.txt"

::初期情報を削除
del "output1.txt"

::エラー回避
type nul > "%~n1_audio_pid.txt"
type nul > "%~n1_video_pid.txt"

::pid部分だけ切り出し audio
for /f "usebackq tokens=2" %%i in ("temp_a2.txt") do echo %%i >> "temp_a3.txt"
del "temp_a2.txt"

for /f "usebackq tokens=2 delims=[" %%i in ("temp_a3.txt") do echo %%i >> "temp_a4.txt"
del "temp_a3.txt"

for /f "usebackq tokens=1 delims=]" %%i in ("temp_a4.txt") do echo %%i >> "%~n1_audio_pid.txt"
del "temp_a4.txt"

::pid部分だけ切り出し video
for /f "usebackq tokens=2" %%i in ("temp_v2.txt") do echo %%i >> "temp_v3.txt"
del "temp_v2.txt"

for /f "usebackq tokens=2 delims=[" %%i in ("temp_v3.txt") do echo %%i >> "temp_v4.txt"
del "temp_v3.txt"

for /f "usebackq tokens=1 delims=]" %%i in ("temp_v4.txt") do echo %%i >> "%~n1_video_pid.txt"
del "temp_v4.txt"

set /P VIDEO_PID=<"%~n1_video_pid.txt"

::ts2aacの起動
for /f "usebackq tokens=1 delims=" %%i in ("%~n1_audio_pid.txt") do (start "" /wait /min "ts2aac.exe" -i "%~1" -o "%~n1" -v "%VIDEO_PID%" -a %%i -B)


shift
goto loop

:end
exit

この記事へのコメント

  • あれこれ右往左往しつつコマンドプロントに不慣れだったため詰まってた所を解決してくれたのでとても助かりました。
    感謝感謝です。
    2018年10月16日 16:20

この記事へのトラックバック