iMovie(ロスレスではありませんが、以前よりも優れています)
iMovie v10(質問が最初に尋ねられてからしばらく後にリリースされた)は、より多くのメディアタイプをより適切に処理するようになりました。
ただし、エクスポート時に再エンコードされるため、技術的にロスレスになることはありません。ただし、もう1つの新機能は、エクスポート品質をカスタマイズする機能であり、よりロスレスに近いものになります。答えのこの部分は、他の「プロジェクト駆動型」のビデオ編集ソフトウェア(PremiereやFinal Cutなど)にも同様に適用できると思います。なぜなら、それらはすべて出力で再エンコードされるからです。
個人的には、1回の再エンコードは大きな問題ではないと一般に考えていますが、ロスレスソリューションを具体的に求めたことを理解しているので...
ロスレス(しかしもっと複雑!)
ビデオの少なくとも一部を再エンコードすることなくビデオを正確にカットできる方法には技術的な制限があり、基本的にはiフレームの周波数に依存します。すべてのフレームがiフレームの場合、どこでもカットできますが、数秒ごとの場合は、コンテンツを失ったり再エンコードしたりすることなく、それらのiフレームでロスレスにカットできます(少なくともストリーム)ので、iフレームで開始できます。
ffmpeg
このSO Q&Aは、を使用してiフレーム間をカットする方法の問題を特に提起しffmpeg
ます。これを行うためのGUIアプリは知りませんが、基本的には次のようなコマンドを実行します。
ffmpeg -i input.m4v -vcodec copy -acodec copy -ss 00:01:20.000 -t 00:37:50.000 output.m4v
指定された2つの時間はstartとdurationであり、secondsまたはのいずれかとして指定できhh:mm:ss.ss
、-acodec copy
および-vcodec copy
はffmpegに再エンコードしないように指示します。
早すぎるとどうなるかわかりませんが、iフレームに出会うまでビデオは基本的に空白(またはプレーヤーによっては破損している)であると思います。そのため、おそらくカットの前に最も近いiフレームを見つけたいでしょう。この答えは、少し厄介ではあるが、ffprobe
とを使用してその問題を解決しawk
ます。基本的にffprobe
、フレームをスキャンしてflags=K
、理想的なカットポイントの前に最も近いキーフレーム()を見つけるために使用します。ビデオの各フレームの完全な出力は、次のように表示されます。
ffprobe -select_streams v -show_frames <INPUT>
リンクされた回答は、特定の時間の前にキーフレームを見つけるためにこのコマンドを提供します:
ffprobe -select_streams v -show_frames -v quiet INPUT.mp4 |
awk -F= '
/pict_type=/ { if (index($2, "I")) { i=1; } else { i=0; } }
/pkt_pts_time/ { if (i && ($2 >= 150)) print $2; }
' | head -n 1
最後に、2つのiフレームの間のどこかを本当にカットする必要がある場合は、ビデオを分割して再参加できます。この回答の情報に基づいて、次のようになります。
ffmpeg -f concat -i list_of_videos.txt -c copy OUTPUT.mp4
list_of_videos.txt
連結するファイルをリストした単純なテキストファイルはどこにあります。
概要
iMovieはほとんどの場合(v10以降)に十分であり、非常に簡単です。
ffmpegは、少しいじることで、ロスレス(またはロスレスに非常に近い)でそれを行うことができます。難易度は、正確な開始点とiフレームの頻度にどれほどこだわりがあるかによって異なります。