動画コンテンツの切り抜き(トリミング)作業において、Adobe Premiere ProやDaVinci ResolveといったNLE(非線形編集ソフト)を立ち上げるのは、往々にしてオーバーエンジニアリングです。単純なカット作業にちょっとした起動時間と、実時間以上のエンコード時間を費やす必要はありません。
FFmpegの「ストリームコピー機能」を活用すれば、ギガバイト級の4K動画であっても、わずか数秒で、かつ1ビットの画質劣化もなく必要なシーンだけを抽出可能です。
本稿では、動画データのパケットを右から左へ受け流すだけの「無劣化カット」の最適解と、その背後にある技術的制約(GOP構造との関係)について解説します。
ffmpeg -y -ss 00:01:30 -to 00:05:30 -i "input.mp4" -c copy "output.mp4"
実戦用スクリプト
再エンコード(画質の変換処理)を行わず、データコピーのみで完了する最速のコマンドです。Windows (PowerShell) と macOS/Linux (Bash) で使い分けてください。
実行コマンド
このコマンドは、指定した開始時刻から終了時刻までのデータを、そのまま新しいコンテナにコピーします。
Windows (PowerShell)
# 変数定義 $InputVideo = "input.mp4" $OutputVideo = "output_cut.mp4" $StartTime = "00:01:30" # 開始時刻 (HH:MM:SS) $EndTime = "00:01:40" # 終了時刻 (HH:MM:SS) # コマンド実行 # -ss : 開始時刻へシーク # -to : 終了時刻を指定(-t なら「長さ」指定) # -c copy : 再エンコードせずストリームを複製 ffmpeg -y -ss $StartTime -to $EndTime -i "$InputVideo" -c copy "$OutputVideo"
macOS / Linux (Bash)
#!/bin/bash INPUT="input.mp4" OUTPUT="output_cut.mp4" START="00:01:30" # 開始時刻 END="00:01:40" # 終了時刻 # コマンド実行 # Input Seeking (-ss を -i の前に配置) により高速シークを実現 ffmpeg -y -ss "$START" -to "$END" -i "$INPUT" -c copy "$OUTPUT"
技術解説:Stream Copyの内部ロジックとトレードオフ
提示したコマンドの核となるのは -c copy(または -c:v copy -c:a copy)オプションです。このオプションが指定された時、FFmpeg内部では以下の挙動をとります。
1. デコード/エンコードのバイパス
通常、動画編集は「デコード(解凍)→ 画像処理 → エンコード(再圧縮)」というプロセスを経ます。これが画質劣化と処理遅延の主原因です。 対して -c copy は、コンテナ(MP4やMKV)から取り出したエンコード済みのパケットを、デコードせずにそのまま新しいコンテナへ格納します(Demux → Mux)。計算負荷はディスクI/O速度にほぼ依存するため、CPU使用率は極めて低く、処理は一瞬で完了します。
2. シーク位置とInput Seeking
コマンド内の -ss を -i の前に配置している点に注目してください。
- Input Seeking (
-ssbefore-i): 入力ファイルを読み込む段階で、指定時刻のパケット位置までファイルポインタを移動させます。デコード処理をスキップするため爆速ですが、後述するキーフレームの制約を受けます。 - Output Seeking (
-ssafter-i): ファイルを先頭からデコードしながら指定位置まで進みます。正確ですが、無劣化カットにおいては-c copyと組み合わせると挙動が不安定になるため、今回のユースケースでは推奨されません。
3. 【重要】キーフレーム(I-frame)の制約
無劣化カットには、技術的に避けられないトレードオフが存在します。それは**「カット地点がキーフレーム(Iフレーム)にスナップされる」**という点です。
- GOP構造の壁: 現代の動画コーデック(H.264, H.265, AV1)は、GOP(Group of Pictures)という単位で圧縮されています。GOPは完全な画像情報を持つ「Iフレーム」から始まり、差分情報しか持たない「P/Bフレーム」が続きます。
- スナップ挙動:
-c copyではP/Bフレーム単体では映像を復元できないため、指定した時刻(例:00:01:30)の直前にある一番近いIフレームまで自動的に開始位置が巻き戻されます。
無劣化カットは「秒単位の厳密な編集」には向きません。「大体このあたり」を切り抜く用途に特化しており、開始地点が最大で数秒(GOP長に依存)ズレる可能性があることを許容する必要があります。もし1フレーム単位の精度が必要な場合は、-c copy を諦め、再エンコードを行う必要があります。
トラブルシューティング
- 切り抜いた動画の最初が真っ暗になる、または止まる
-
プレーヤーの互換性問題、または編集ソフトの仕様です。 無理やりPフレームから開始されたデータになっている可能性があります。上記のコマンド(Input Seeking)を使用していればFFmpegが自動的に直前のキーフレームを拾いますが、再生ソフトによってはその余分な数秒(マイナス方向の時間)をうまく処理できない場合があります。YouTube等へのアップロード用であれば、プラットフォーム側で補正されるため問題ないケースが大半です。
-tと-toの違いは?-
-t 10: 開始地点から「10秒間」切り抜く(Duration)。-to 00:01:40: 動画のタイムスタンプで「1分40秒」の地点まで切り抜く(End Time)。 直感的に「ここからここまで」を指定したい場合は-toが便利です。
まとめ
動画の「無劣化カット」は、画質の維持と作業効率の最大化において最強のツールです。 FFmpegの -c copy を使いこなすことは、動画データを「映像」としてではなく「パケットの塊」として扱うエンジニアリングの第一歩です。SNSへのシェアや、会議録画のアーカイブ整理など、厳密な精度よりもスピードが求められるシーンで、このコマンドは圧倒的なパフォーマンスを発揮します。


コメント