FFmpegで動画を無劣化・爆速カット:-c copyによるトリミング術

当ページのリンクには広告が含まれています。
FFmpegで動画を無劣化・爆速カット:-c copyによるトリミング術

動画コンテンツの切り抜き(トリミング)作業において、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 (-ss before -i): 入力ファイルを読み込む段階で、指定時刻のパケット位置までファイルポインタを移動させます。デコード処理をスキップするため爆速ですが、後述するキーフレームの制約を受けます。
  • Output Seeking (-ss after -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へのシェアや、会議録画のアーカイブ整理など、厳密な精度よりもスピードが求められるシーンで、このコマンドは圧倒的なパフォーマンスを発揮します。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次