†ぽんこつビデオ工房†

無劣化原盤の作成

作成開始日 2021.06.09
最終更新日 2022.07.29

無劣化原盤とは、無損失(無変換)ではないが、元ファイルのクオリティを可能な限り維持した原盤。再エンコを伴うので変換時間は掛かるが、フレーム単位の編集も簡単……と言いたいところだが、Avidemuxで元ファイルのクオリティを維持したまま、高速に変換するのは無理。そこで、Avidemuxを編集ポイントの確認にのみ使用し、実際の切り出しと再エンコードはffmpegで行うことにする。

ここで扱うff-mepg4/qscale=0変換(q0変換)は、タテマエ上は「無損失・可逆変換」と言うことになっている。しかし、実際に変換してみると、決して可逆変換ではないことが判る。ノイズの多い映像には補正を掛ける傾向があるようだ。本当に無損失・可逆変換であれば、ノイズも忠実に再現するはず。

●基本的な考え方

まず、Avidemuxで元ファイルをフレーム単位で編集する。この編集作業の履歴は、プロジェクト・ファイルとして保存可能(file|project script|save as project)。これはごく短いテキスト・ファイルなので、簡単に保存できるし、簡単に参照できる。で、このプロジェクト・ファイルから編集点情報を抜き出して、ffmpegにパラメータとして食わせれば、フレーム単位の切り出しが可能になる。
#PY  <- Needed to identify #
#--automatically built--

adm = Avidemux()
adm.loadVideo("D:/VRO/08.avi")
adm.clearSegments()
adm.addSegment(0, 4705000, 782482000)	← Aパートの開始点と長さ
adm.addSegment(0, 877577000, 642609000)	← Bパートの開始点と長さ
adm.addSegment(0, 1610309000, 14882000)	← クレジットの開始点と長さ
adm.markerA = 0
………

ただし、ここで一番問題になるのが、元ファイルのフォーマット。mepg(VRO/VOB)形式をそのまま食わすと、誤差が大きくて使い物にならない。素通しavi変換でも誤差は発生するし、音声に「ブツ」というノイズが入る現象も複数回経験した。mkvも誤差問題が発生した。結局、この段階でff-mpeg4/q0変換を使うのがベストと言うのが結論。

【追記】コマンドライン版avidemuxで変換を掛ける方法を見つけた(2022.07.29)

●作業手順

【注意】流石に今回の処理をバッチで済ますのは無理がある。予めPerlをインストールしておくこと(ちょっとハードル高いかな?)。

@VRO原盤をff-mpeg4で無劣化変換する(時間情報のトリム)
 ffmpeg -i xxx.vro -vcodec mpeg4 -qscale 0 -acodec copy xxx.avi。
Aavidemuxでaviファイルを開いてフレーム単位で編集
B[file|project script|save as projectで]プロジェクト・ファイルを保存する
 プロジェクト・ファイル名は元ファイル名に合わせる
 元ファイルが「03.avi」であれば「03.py」とする(拡張子指定は省略可)
C複数のファイルがある場合も、同様に編集してプロジェクトを保存する
D下記の抜き出し生成スクリプト「pick.pl」を実行する
 このスクリプトを実行すると「build.bat」というバッチファイルが作成される
Eカレントに「genban」というサブディレクトリを作成し、build.batを実行する

以上で「genban」ディレクトリ内にff-mpeg4/q0形式の原盤ファイルが出来上がる。「genban」を手作業で作成するのは少々手抜きだったかな。この辺りは、必要に応じてpick.plを書き換えて欲しい。

なお、ここで作成されるファイルは「ff-mpeg4コーデック/aviコンテナ」という、かなり変則的なもの。これをそのまま再生できるプレイヤーは少数派ではないかと思う。したがって、必要に応じてh.264なりxvidなりに変換して視聴すると良い。

●留意点

この手法にはいくつかの問題点がある。最大の問題点は、ごく希にではあるが、切り出し部分の先頭フレームに異常が発生する(画像の乱れ、停止、異音等)。原因究明はできていないので、根本的な解決法方はない;発生したら個別対応するしかない。

もう一つの問題点は、q0変換後のサイズ。物にもよるのだが、TVアニメは元ファイルの0.7〜1.3倍くらいのサイズになる。元ファイルよりも小さくなる方が多いが、動きの激しい作品ではかなり膨らむ。作品によって無損失原盤と使い分けるとよい。

pick.pl

my @py=glob('*.py');

my $fname;
my $st;
my $p,$q,$r;
my $top,$bot;
my $fbat;
my $flst;

open my $fbat, '>', 'build.bat';

foreach(@py){

  $st=$_;
  print "$st \n";
  $p=index($st,'.');
  $fname=substr($st,0,$p);

  open my $fp  , '<', $fname.'.py';
  open my $flst, '>', $fname.'.lst';

  print $fbat "del _?.avi \n";

  $n=0;
  while ($st = readline $fp){
    chomp $st;
    if (index($st,'addSegment')>=0) {
      $n=$n+1;
      print "$n : $st \n";

      $p=index($st,' ');
      $q=rindex($st,' ');
      $r=index($st,')');

      $top=substr($st,$p+1,$q-$p-2)/1000000;
      $bot=substr($st,$q+1,$r-$q)/1000000;
      print $fbat "ffmpeg -ss $top -i $fname.avi -t $bot
      -vcodec mpeg4 -qscale 0 _$n.avi\n";
      print $flst "file _$n.avi\n"
    }
  };
  print $fbat "ffmpeg -f concat -i $fname.lst -c copy ";
  #print $fbat " -aspect 4:3 ";
  #print $fbat " -aspect 16:9 ";
  print $fbat "genban\\$fname.avi \n";
  print $fbat "del _?.avi \n";

  close $fp;
  close $flist;
};

print $fbat "echo  \n";
close $fbat;


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