†ぽんこつビデオ工房†

フレーム単位の編集

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

mpeg系動画を無損失でカットする場合、先頭がIフレームでないと映像が乱れる。一般的なmpeg2の場合、1gopは0.5秒くらいなので、カット位置には0〜0.5秒の誤差が発生する。 このため、音声の頭が欠けたり、フェードインの演出が台無しになってしまうこともある。やはり、できれば、フレーム単位で正確にカットしたい。

その場合、Avidemuxでフレーム単位で編集し、再エンコして保存すれば良いのだが、Avidemuxで再エンコを行うと、びっくりするくらい時間が掛かる。少なくともウチのPCでは、ffmpegによる変換の10倍くらいの時間が掛かる。オプションのデフォルト値も相当に戸惑う変な設定である。そこで、ここではAvidemuxとffmpegを併用して、効率的なフレーム単位編集の方法を考えた。スキームは2つ;

(ア)無変換でパートごとに切り出して、変換時に頭のゴミを取ってバインドする
(イ)Avidemuxのプロジェクトファイルを参照して無劣化変換を掛ける

以下では、各スキームを概要を少し詳しく説明する。

●ライブラリ構築の大前提

と、その前に、私のライブラリ構築の基本的な考え方を述べておく。

まず、編集前ファイルのクオリティを可能な限り損なわない形で保存したい。理想を言えば、mpegのまま再エンコせずにCMを奇麗にカットするのが最善の形であるが、これは原理的に不可能。その一方で、mpeg系は視聴用には適さない。現在ではh.264を初め、より高圧縮で汎用性の高いコーデックが開発されているし、再生するデバイスによって、最適のレートや画面サイズも異なる。

そこで、@クオリティを保つことを優先した「原盤」と、A視聴環境に合わせた「視聴用」、の2種類のファイルを作成する。異なる環境の視聴用が必要になった場合、視聴用を変換するのではなく、原盤から作成=再エンコする。

この考え方には二つのメリットがある。一つは、原盤がそのままバックアップとなる点。もう一つは、原盤は必ずしも完成形でなくても良い点。つまり、原盤にCMが入っていても、視聴用を作成する段階で簡単に削除できる構造ならば、特に問題にはならない。

以上を踏まえた上で…

●(ア)無変換でパートごとに分割

前述の通り、mpeg系(VOB/VRO)ファイルを無損失で編集する場合、先頭のカット位置はIフレームでなければならない(末尾は任意)。したがって、本編の先頭フレームの直前または直後のIフレームでカットすることになる。直前でカットすれば若干(0〜0.5秒)ながらCMの残滓がくっついてしまうし、直後でカットすれば同じく若干ながら本編が削られてしまう。

ここでは、本編が削られてしまう問題を解決するのが目的なので、直後でカットするという選択肢はない。直前でカットして原盤を作り、視聴用ファイルを作成する段階で、くっついてるゴミを何とかしよう、という方向で考える。

@Iフレーム位置でAパートとBパートを切り出して(Avidemux)、

Aバインドする際に、各パート頭のCMの残滓を取り除く(ffmpeg)

この手法は、原盤ファイルを無損失=無変換で切り出すため、再エンコードによるファイルサイズの増減が発生しない。そのため、動きが激しい作品の保存に適している。具体的な処理方法は【こちら】

●(イ)プロジェクトファイルを参照して無劣化変換

こちらの手法は、ff-mpeg4の「-qsale 0」変換(以下、q0変換)を利用する。q0変換は無損失ではないが「無劣化」と言われている。なので、再エンコしてもクオリティは下がらない(はず)。本当の本当に「無劣化」なのかは微妙なところだが、確かに(特殊な状況を除けば)識別可能な劣化は見つかっていない。

原理的にはこちらは極めて単純で、たとえば、mpeg(VOB/VRO)ファイルをAvidemuxでフレーム単位編集して、ff-mpeg4のqscale=0で出力すれば出来上がり−−と言うほど簡単なハナシではない(u_u;) まず、私が愛用しているAvidemux 2.6.8では、ff-mpeg4は指定できるが、qscale=0が指定できない。他バージョンのAvidemuxを使用する可能性はゼロなので、これは致命的と言える。ちなみに、qscale=2は指定可能だが、こちらは目視ではっきり判るレベルの劣化が見られ、しかも変換速度がとても遅い。

もう一つ問題になるのが誤差。これはちょっと不思議なのだが、フレーム単位のカットというのは、コーデック/コンテナによってカット位置に誤差が発生するようなのだ。しかも、その誤差の大きさは不定で、しばしば無視できない大きさになる。これを防ぐためには、事前にファイルの時間情報を「奇麗に」しておく必要があるようだ。

で、試行錯誤の結果はたどり着いたスキームが;

@mpeg(VRO/VOB)ファイルをq0変換する(時間情報のトリム)
Aq0変換したff-mpeg4ファイルをAvidemuxで開く
BAvidemuxでファイルをフレーム単位で編集する
Cプロジェクトファイルを保存する
Dプロジェクトファイルからカットポイントの情報抜き出す
Eカットポイントの情報に従って、ffmpegでファイルを切り出す
F切り出したファイルをffmpegでバインドする

一見すると少し面倒臭く見えるが、実際はとても面倒臭い。また、原盤もq0変換となるため、場合によってはファイルサイズがかなり膨らむ。動きの少ない作品に適した保存方法と言える。ただ、原盤段階でCMが奇麗にカットできているので、視聴用ファイルの作成はとても簡便になる。具体的な処理方法は【こちら】


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