†ぽんこつビデオ工房†

Avidemux_cliでプロジェクト・ファイルを実行

作成開始日 2022.12.26
最終更新日 2022.12.27

●基本的な考え方

@Avidemuxを起動して動画ファイルを読み込む
A動画を編集する
Bプロジェクト・ファイル(.py)を保存する
Cavidemux_cli --run xxx.py --nogui --save xxx.avi の要領で編集ファイルを保存する
と言うことで、大して難しいハナシではないのだが、この方法では処理をする動画ファイルをいちいちAvidemuxで開かねばならず、コマンドラインを使う有難みがない。

●プロジェクト・ファイルを直接作成する

もし、編集内容が動画ファイルごとに細かく異なるものであれば、手間が掛かっても一つずつ処理をしていくしかない。しかし、処理をする全てのファイルに対して「先頭5秒および末尾3分を削除する」といった単純な処理であれば、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」オプションで指定する。

●プロジェクト・ファイルの自動生成

これでファイルをいちいちAvidemuxで開かなくてもよくなったが、pyファイルを手作業で作成していたら、やっぱり面倒臭い。そこで、簡単なバッチ(AVCL3.BAT)を作ることにした。「AVCL3 *.VRO」の要領で実行すれば、「D:\VRO」にある「*.VRO」ファイル(長さ30分10秒)から、3秒〜27分10秒の部分が無変換のまま切り出されて、aviファイルに保存される。

なお、緑文字の各パラメータは各自の環境に合わせて書き直すこと。また、「< 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において「)」は機能文字として見なされるようで、正常に出力されない事がある。必ず、「^)」として機能を抑止すること。

●全面的なAvidemux化は…?

今まで、ffmpegとAvidemuxとを併用していたのは、フレーム単位の編集にはAvidemuxが必須だが、変換はffmpegの方が効率的だから。しかし、avidemux_cliにpyファイルを食わせることができるなら、すべての工程をavidemuxで効率的に行うことも出来るのではないか? pyファイルを保存して、バッチで順次avidemux_cliに食わせれば自動的に処理できる。相性問題もない。

が、結局、このアイディアは没。やはり、変換速度が違いすぎる。GUIのAvidemuxのときのように10倍とかにはならないが、やはり同じ処理でもffmpegの方が3倍程度高速で、しかもCPU負荷が小さい。画質に関しては細かくチェックしていないが、標準的なクオリティ(変換後のファイルサイズがほぼ同じ)であれば、ffmepgの方が良いような気がする。


【ぽんこつビデオ工房目次】 【ホーム】