†ぽんこつビデオ工房†
作成開始日 2022.12.26
最終更新日 2022.12.27
@Avidemuxを起動して動画ファイルを読み込む A動画を編集する Bプロジェクト・ファイル(.py)を保存する Cavidemux_cli --run xxx.py --nogui --save xxx.avi の要領で編集ファイルを保存すると言うことで、大して難しいハナシではないのだが、この方法では処理をする動画ファイルをいちいちAvidemuxで開かねばならず、コマンドラインを使う有難みがない。
そんな程度の処理なら、ffmpegですぐにできる…のは確かなんだが、ffmpegとAvidemuxって目茶苦茶相性が悪くて、ffmpegで素通し変換したファイルをavidemuxに読み込ませると、とんでもなく音ズレしたり、画像が動かなくなったりで、とても使い物にならないのだよ。
まず、プロジェクト・ファイル(.py)ファイルの中身を見ておくと、次のような単純なテキストファイルになっている。
#PY <- Needed to identify # #--automatically built-- adm = Avidemux() adm.loadVideo("D:/VRO/09.avi") adm.clearSegments() adm.addSegment(0, 0, 1809576242) adm.markerA = 5271938 adm.markerB = 1626993660 adm.videoCodec("Copy") adm.audioClearTracks() adm.setSourceTrackLanguage(0,"unknown") adm.audioAddTrack(0) adm.audioCodec(0, "copy"); adm.audioSetDrc(0, 0) adm.audioSetShift(0, 0,0) adm.setContainer("AVI", "odmlType=1")ざっくり意味を取って行くと;
#で始まる行:コメント adm.loadVideo("D:/VRO/09.vro"):読み込むファイル名 adm.addSegment(0, 0, 1809576242):ファイルの長さ(1809.576242秒30分10秒) adm.markerA = 5271938:切り出しの開始位置(5.27...秒) adm.markerB = 1626993660:切り出しの終了位置(1626.99...秒27分7秒) adm.videoCodec("Copy"):ビデオ・コーデックは無変換 adm.audioCodec(0, "copy");:オーディオ・コーデックは無変換 adm.setContainer("AVI", "odmlType=1"):コンテナはAVI
【参考】時間の数値は秒を1000000倍したもの。秒に直すには1000000で割ればよい。ただし、実際にその精度で編集されるわけではない。また、無変換編集の場合は編集点(始点)が直近のIフレームに丸められる。要するに、精度にあまり神経質になっても意味がない。
つまり、切り出し範囲が固定ならば、ファイルによって変化するのは読み込みファイル名の行だけだ。したがって、それぞれのファイルに対して、読み込みファイル名のみ変更したpyファイルを作成してやればよい。なお、このpyファイル中には出力ファイル名指定がないが、これはavidemux_cliの「--save」オプションで指定する。
なお、緑文字の各パラメータは各自の環境に合わせて書き直すこと。また、「< anwaser.txt」は連番抑止機能で、中身は「n」1文字のテキスト・ファイル【別項参照】。
@REM ***** AVCL3.BAT ***** @REM アタマとお尻のCMをカットして素通しAVI変換 @echo off @setlocal enabledelayedexpansion set markA=3000000 set markB=1630000000 @for %%f in (%1) Do @( set py=tmp.py echo adm = Avidemux(^) > !py! echo adm.loadVideo("D:/VRO/ %%f"^) >> !py! echo adm.clearSegments(^) >> !py! echo adm.addSegment(0, 0,1809576242 ^) >> !py! echo adm.markerA = !markA! >> !py! echo adm.markerB = !markB! >> !py! echo adm.videoCodec("Copy"^) >> !py! echo adm.audioClearTracks(^) >> !py! echo adm.setSourceTrackLanguage(0,"unknown"^) >> !py! echo adm.audioAddTrack(0^) >> !py! echo adm.audioCodec(0, "copy"^); >> !py! echo adm.audioSetDrc(0, 0^) >> !py! echo adm.audioSetShift(0, 0,0^) >> !py! echo adm.setContainer("AVI", "odmlType=1"^) >> !py! set out=%%~nf.avi if %%f==!out! (set out=%%~nf@.avi) "C:\Program Files\Avidemux 2.6 - 64bits\avidemux_cli" ^ --run !py! --nogui --save !out! < answer.txt > nul ) del !py! c:\windows\media\chimes.wav endlocal EXIT /B
【注意】ECHOにおいて「)」は機能文字として見なされるようで、正常に出力されない事がある。必ず、「^)」として機能を抑止すること。
が、結局、このアイディアは没。やはり、変換速度が違いすぎる。GUIのAvidemuxのときのように10倍とかにはならないが、やはり同じ処理でもffmpegの方が3倍程度高速で、しかもCPU負荷が小さい。画質に関しては細かくチェックしていないが、標準的なクオリティ(変換後のファイルサイズがほぼ同じ)であれば、ffmepgの方が良いような気がする。