はい、承知いたしました。FFmpegのcopy
コーデックに焦点を当てた約5000語の詳細な解説記事を作成します。
ffmpeg copy完全ガイド:高速・無劣化な動画処理の切り札
動画や音声の処理は、現代のデジタルライフにおいて避けて通れないタスクです。動画編集、フォーマット変換、ストリーミング、アーカイブ作成など、さまざまな場面でメディアファイルを扱う必要があります。しかし、これらの処理にはしばしば時間と計算リソースがかかり、さらに処理の過程で画質や音質が劣化してしまうという問題が付随します。
ここで登場するのが、マルチメディア処理の分野でデファクトスタンダードともいえる強力なツール、FFmpegです。そして、そのFFmpegが提供する機能の中でも、特に「高速」かつ「無劣化」という魅惑的な特性を持つのが「copy
」コーデック(厳密にはコーデックではなく、ストリームのコピーモードを指しますが、FFmpegの文脈ではこのように呼ばれることが多いです)です。
この記事では、このFFmpegのcopy
モードに焦点を当て、その原理、基本的な使い方から高度な応用、そして注意点までを詳細に解説します。この記事を読めば、FFmpegのcopy
がどのように動画処理の強力な切り札となるのかを理解し、あなたのメディアワークフローを劇的に改善できるようになるでしょう。
はじめに:なぜFFmpegのcopy
を学ぶ必要があるのか?
動画や音声ファイルを別の形式に変換したり、一部を切り出したり、複数のファイルを結合したりといった処理を行う際、最も一般的な方法は「再エンコード」です。これは、元のファイルをデコード(展開)し、必要な処理(編集、フィルタリングなど)を施した後、目的の形式で再びエンコード(圧縮)するという手順を踏みます。
しかし、この再エンコード処理にはいくつかの大きな問題点があります。
- 画質・音質の劣化: 多くの動画・音声コーデックは非可逆圧縮を採用しています。これは、人間には感知しにくい情報を削除することでデータサイズを小さくする技術です。再エンコードを行うということは、一度圧縮されたデータを展開し、再度圧縮するというプロセスを経るため、元のデータからさらに情報が失われ、画質や音質が劣化する可能性があります。特に、何度も再エンコードを繰り返すと劣化は無視できないレベルになることがあります。
- 処理時間の長さ: エンコードとデコードは非常に計算負荷の高い処理です。特に高解像度や高フレームレートの動画、あるいは複雑な圧縮方式を使用している場合、再エンコードには膨大な時間とCPUリソースが必要となります。
- 計算リソースの消費: 前述の通り、エンコード/デコードはCPUやGPUを酷使します。処理中は他の作業が重くなったり、システムの応答性が低下したりすることがあります。
これらの問題を解決するための強力な手段こそが、FFmpegのcopy
モードです。copy
モードは、再エンコードを完全にスキップし、ファイル内の動画や音声のビットストリーム(圧縮された生データ)をそのままコピーして出力ファイルに格納します。
この「そのままコピー」という仕組みにより、以下のメリットが得られます。
- 無劣化: ビットストリーム自体に変更を加えないため、原理的に画質・音質の劣化は一切ありません。
- 超高速: エンコード/デコードの計算負荷がゼロになるため、ファイルコピーに近い速度で処理が完了します。処理時間はファイルサイズや長さにほとんど依存せず、主にストレージの読み書き速度に左右されます。
- 低負荷: CPUやGPUのリソースをほとんど消費しません。
もちろん、copy
モードには万能ではありません。特定の制約も存在します。しかし、そのメリットを理解し、適切に活用することで、多くの一般的な動画・音声処理タスクを劇的に効率化し、品質を維持することが可能になります。
この記事では、まずFFmpegの基本的な概念から始め、copy
モードの原理を掘り下げ、具体的なコマンド例を通じてその使い方をマスターしていきます。さらに、応用的な使い方や、使用上の注意点、そしてよく遭遇するトラブルシューティングについても詳しく解説します。さあ、FFmpegのcopy
機能をマスターし、あなたのメディア処理を次のレベルへと引き上げましょう。
第1章:FFmpegとは? マルチメディア処理の強力なツール
ffmpegのcopy
について理解する前に、まずFFmpeg自体がどのようなツールであるかを知っておくことが重要です。FFmpegは、音声や動画を記録・変換・再生するための、オープンソースの包括的なマルチメディアフレームワークです。コマンドラインツールとして提供されており、非常に多機能であることから、個人ユーザーからプロフェッショナル、そして多くのソフトウェアやサービス(YouTube、VLC Media Playerなど)のバックエンドとしても利用されています。
FFmpegの構成要素と機能
FFmpegは、いくつかの主要なコンポーネントから構成されています。
ffmpeg
: 主にファイル変換(トランスコーディング)を行うコマンドラインツールです。この記事で扱うcopy
モードもこのツールで利用します。ffprobe
: メディアファイルやストリームの情報を分析・表示するツールです。ファイルに含まれるストリームの種類、コーデック、解像度、フレームレート、ビットレートなどの詳細情報を取得できます。ffplay
: シンプルなメディアプレイヤーです。FFmpegのデコード機能をテストしたり、ストリームを再生したりするのに便利です。
FFmpegが提供する主要な機能は以下の通りです。
- エンコード/デコード: さまざまな音声・動画コーデック(H.264, H.265, VP9, AAC, MP3, FLACなど多数)をサポートしており、相互に変換できます。
- muxing/demuxing: さまざまなコンテナ形式(MP4, MKV, MOV, AVI, TS, FLVなど多数)に対応しており、ストリームをコンテナに格納したり(muxing)、コンテナから取り出したり(demuxing)できます。
- フィルタリング: 動画のリサイズ、クロップ、回転、色調補正、テキストオーバーレイ、音声の音量調整、ノイズ除去など、多様なフィルタリング処理を適用できます。
- ストリーミング: ネットワーク上でのメディアの送受信(RTMP, HLS, DASHなど)をサポートしています。
- フォーマット変換: 上記の機能を組み合わせて、あるフォーマットのファイルを別のフォーマットに変換します。
コマンドラインツールの基本構造
ffmpeg
コマンドは、一般的に以下の構造で使用されます。
bash
ffmpeg [global_options] {[input_options] -i input_url} ... {[output_options] output_url} ...
ffmpeg
: コマンド名です。[global_options]
: 全体的な挙動を制御するオプションです(例:-y
で上書き確認なし、-v
でログレベル指定)。{[input_options] -i input_url}
: 入力ファイルを指定します。-i
の前にその入力ファイルに対するオプションを指定できます(例:-ss
で入力の開始位置を指定)。複数の入力を指定することも可能です。{[output_options] output_url}
: 出力ファイルを指定します。出力ファイルに対するオプション(エンコード設定、フィルタ設定など)を指定します。複数の出力を指定することも可能です。
copy
モードは、この出力オプションの一部として指定します。具体的には、エンコード設定を指定する際に、特定のコーデック名を指定する代わりに「copy
」というキーワードを使用します。
コーデックとコンテナ:FFmpegを理解する上で重要な概念
FFmpegを扱う上で欠かせないのが、「コーデック」と「コンテナ」という概念です。
- コーデック (Codec): Compressor-Decompressorの略で、デジタルデータを圧縮・展開するためのアルゴリズムまたはソフトウェアを指します。動画や音声の元のデータを効率的に記録・伝送するために圧縮し、再生時に元の状態に戻す(展開する)役割を担います。例えば、動画のコーデックにはH.264 (AVC), H.265 (HEVC), VP9, AV1などがあり、音声のコーデックにはAAC, MP3, Opus, FLACなどがあります。
- コンテナ (Container Format): 複数のデータストリーム(動画ストリーム、音声ストリーム、字幕ストリーム、メタデータなど)を一つのファイルにまとめて格納するためのファイル形式です。コンテナ形式は、中のストリームがどのようなコーデックでエンコードされているかとは独立した概念です。例えば、MP4 (.mp4), MKV (.mkv), MOV (.mov), AVI (.avi), WebM (.webm) などがあります。一つのMP4ファイルの中にH.264で圧縮された動画ストリームとAACで圧縮された音声ストリームが格納されている、といった具合です。
FFmpegでファイル変換を行う際、通常は入力ファイルから各ストリーム(動画、音声など)をデコードし、必要に応じてフィルタリングなどの処理を施し、目的のコーデックで再エンコードし、目的のコンテナ形式でmuxingして出力ファイルを作成します。
一方、copy
モードを使用する場合は、デコードもエンコードも行いません。入力ファイルのコンテナから取り出した(demuxed)特定のストリームの圧縮されたビットストリームそのものを、そのまま出力ファイルのコンテナに格納(muxing)します。これがcopy
モードが高速かつ無劣化である理由です。ただし、出力先のコンテナ形式が、入力ストリームに使用されているコーデックをサポートしている必要があります。
次の章では、このcopy
モードの原理とメリット・デメリットについて、さらに詳しく掘り下げていきます。
第2章:動画処理の常識を覆す copy
コーデックの魔法
一般的な動画処理、例えば「ある動画ファイルを別のフォーマットに変換する」というタスクは、通常以下のステップで行われます。
- Demuxing: 入力ファイル(コンテナ)から、動画ストリーム、音声ストリーム、字幕ストリームなどを分離します。
- Decoding: 分離された圧縮ストリームを、それぞれのコーデックを使ってデコードし、未圧縮のピクセルデータ(動画)やPCMデータ(音声)に戻します。
- Processing: デコードされた未圧縮データに対して、リサイズ、クロップ、色調補正、音量調整などのフィルタリングや編集処理を適用します。
- Encoding: 処理済みの未圧縮データを、目的のコーデックを使って再び圧縮します。
- Muxing: 新しくエンコードされたストリームと、必要であればコピーした字幕ストリームなどを、目的のコンテナ形式にまとめて出力ファイルとして書き出します。
このプロセスの中で、ステップ2のデコードとステップ4のエンコードは非常に計算負荷が高く、時間もかかります。また、ステップ4のエンコードでは非可逆圧縮が使われることが多く、画質・音質の劣化が発生します。
copy
モードの原理:ビットストリームをそのままコピー
ここでcopy
モードの出番です。FFmpegで-c copy
(または-codec copy
)オプションを指定すると、FFmpegは通常の処理フローとは異なる特別な動作をします。
- Demuxing: 入力ファイル(コンテナ)からストリームを分離するところまでは同じです。
- Copying: 分離されたストリームをデコードしません。代わりに、圧縮された状態のビットストリームそのものを一時的にバッファリングします。フィルタリングなどの処理もこの時点では適用できません。
- Muxing: バッファリングされたビットストリームを、直接、出力ファイルのコンテナに書き込みます。
つまり、copy
モードはデコードもエンコードも行わず、ストリームの圧縮データを「コピー&ペースト」するだけなのです。
copy
モードの圧倒的なメリット
この原理から生まれるcopy
モードのメリットは計り知れません。
- 完全な無劣化処理: エンコードによる再圧縮を行わないため、元の画質・音質を100%維持できます。デコードやエンコードの際に情報が失われることがありません。これは、アーカイブ用途や、編集前の素材準備など、品質維持が最優先される場合に非常に重要です。
- 驚異的な処理速度: デコードとエンコードという計算負荷の高い処理が完全にスキップされるため、処理速度は飛躍的に向上します。一般的な動画ファイルの処理であれば、ファイルサイズや長さにかかわらず、数秒から数十秒で完了することがほとんどです。これは、ファイルの読み書き速度がボトルネックになるためです。長い動画ファイルでも、再エンコードに数時間かかるような処理が、
copy
を使えば数分で終わるということも珍しくありません。 - 低いCPU/GPU負荷: エンコード/デコードを行わないため、CPUやGPUのリソースをほとんど消費しません。処理中でも他の作業を快適に行うことができます。サーバー上での処理や、複数のタスクを同時に実行する場合にも有利です。
- ファイルサイズの維持: 非可逆エンコードによるファイルサイズの変化がありません。元のファイルのサイズとほぼ同じサイズのファイルが出力されます(コンテナ形式のオーバーヘッドによる若干の差はあり得ます)。
copy
モードの制約とデメリット
しかし、copy
モードは魔法ではありません。いくつかの重要な制約があります。
- フィルタリングや編集ができない: デコードされていない圧縮データに対して、リサイズ、クロップ、色調補正、音量調整といった映像・音声の内容を加工する処理は一切できません。これらの処理を行うには、データをデコードしてアクセス可能な状態にする必要があるため、
copy
モードは使用できません。 - コーデックやコンテナの互換性: コピーするストリームのコーデックが、出力先のコンテナ形式でサポートされている必要があります。例えば、VP9でエンコードされた動画ストリームを、VP9をサポートしていない古いAVIコンテナにコピーしようとしても失敗します。また、特定のコンテナ(例: MP4)は、サポートするコーデックの種類だけでなく、そのプロファイルやレベル、さらには GOP (Group of Pictures) 構造などにも制約がある場合があります。これらの制約を満たさない場合、コピー自体は成功しても、再生互換性が低いファイルになる可能性があります。
- ストリーム構造への依存: コピー元ストリームの構造(例: 可変フレームレート VFR, 不連続なタイムスタンプ)がそのままコピーされるため、出力ファイルで予期しない問題が発生する可能性があります。特にVFRの動画ストリームを
copy
すると、再生時に音ズレやコマ落ちが発生することがあります。 - セグメント(チャンク)処理の難しさ: 特定の時間範囲だけを正確に切り出す「トリミング」を
copy
モードで行う場合、キーフレームという概念が重要になります(後述)。一般的な動画ファイルは、すべてのフレームが完全に独立しているわけではなく、一部のフレーム(Iフレーム/キーフレーム)を基準にして、それ以降のフレーム(Pフレーム, Bフレーム)が差分情報として記録されています。そのため、キーフレーム以外の位置からコピーを開始すると、開始位置から次のキーフレームまでのフレームが正しくデコードできず、再生が乱れることがあります。このため、copy
モードでのトリミングは、必ずしも指定したフレームから正確に始まるわけではありません。
これらの制約があるため、copy
モードはあらゆる動画処理に使えるわけではありません。しかし、「フォーマット変換だけしたい」「不要な音声トラックを削除したい」「メタデータを編集したい」など、動画や音声の内容自体を変更しない種類の処理においては、copy
モードは圧倒的に有利な選択肢となります。
次の章では、これらの原理を踏まえた上で、FFmpegのcopy
モードの基本的な使い方を具体的なコマンド例とともに見ていきましょう。
第3章:ffmpeg copy の基本コマンドと使い方
FFmpegでcopy
モードを使用するには、出力オプションとして-c copy
または-codec copy
を指定します。このオプションは、入力ファイルから出力ファイルへストリームをコピーする際に、エンコーダーとして「コピー」を選択することを意味します。
基本的なコピーコマンド:すべてのストリームをコピー
最も基本的な使い方は、入力ファイルに含まれるすべてのストリーム(動画、音声、字幕など)をそのままコピーし、別のコンテナ形式で出力することです。
bash
ffmpeg -i input.mkv -c copy output.mp4
このコマンドは、以下の処理を行います。
-i input.mkv
: 入力ファイルとしてinput.mkv
を指定します。-c copy
: 出力ファイルoutput.mp4
に対して、すべてのストリームをコピー(再エンコードしない)するように指示します。output.mp4
: 出力ファイル名を指定します。
解説:
この例では、MKVコンテナに入っているストリーム(例えばH.264動画とAAC音声)を、再エンコードせずにそのまま抽出し、MP4コンテナに格納し直しています。この処理は非常に高速で、画質・音質劣化もありません。ただし、前述の通り、MKVに入っていたコーデック(この例ではH.264とAAC)がMP4コンテナでサポートされている必要があります。一般的なコーデックであれば問題ありませんが、もしMKVに例えばFLAC音声ストリームが入っていた場合、MP4コンテナは通常FLACをサポートしないため、このコマンドはエラーになるか、音声ストリームのコピーに失敗します。
-c copy
は、動画ストリームにも音声ストリームにも適用されます。もし入力ファイルに複数の動画ストリームや音声ストリームがある場合、デフォルトでは最初の動画ストリームと最初の音声ストリームがコピーされます。他のストリームも含めすべてのストリームをコピーしたい場合は、-map 0
と組み合わせることで、入力ファイルのすべてのストリームを選択的に出力に含めることができます。しかし、copy
モードの場合はデフォルトで全ストリームがコピーされることが多いです(正確には、FFmpegが適切なデフォルトマップを選択する)。-map 0
は、より詳細なストリーム選択が必要な場合に重要になります(後述)。
特定のストリームのみをコピー
-c copy
は全てのストリームに適用されますが、動画ストリームだけ、あるいは音声ストリームだけをコピーしたい場合、それぞれのストリームタイプに対して個別にcopy
を指定することも可能です。
- 動画ストリームのみコピー:
-c:v copy
- 音声ストリームのみコピー:
-c:a copy
:v
は動画ストリーム、:a
は音声ストリームを指します。
例:動画ストリームだけをコピー(音声はエンコード)
bash
ffmpeg -i input.mkv -c:v copy -c:a aac -b:a 192k output.mp4
-c:v copy
: 動画ストリームはコピーします。-c:a aac -b:a 192k
: 音声ストリームはAAC形式、192kbpsのビットレートで再エンコードします。
このコマンドは、動画は無劣化・高速で処理しつつ、音声は目的の形式に変換するという、部分的な無劣化処理を実現します。例えば、高音質のFLAC音声が埋め込まれたMKVファイルを、より汎用的なAAC音声を持つMP4に変換したい場合に便利です。
例:動画ストリームのみコピー(音声は削除)
動画ストリームだけを抜き出し、音声トラックを削除したい場合は、音声トラックを無視するオプション-an
を使用します。
bash
ffmpeg -i input.mkv -c:v copy -an output_video_only.mp4
-c:v copy
: 動画ストリームはコピーします。-an
: 音声ストリームを無視します(出力に含めません)。
同様に、音声ストリームだけを抜き出し、動画トラックを削除したい場合は、動画トラックを無視するオプション-vn
を使用します。
bash
ffmpeg -i input.mkv -c:a copy -vn output_audio_only.m4a
-c:a copy
: 音声ストリームはコピーします。-vn
: 動画ストリームを無視します(出力に含めません)。output_audio_only.m4a
: 出力ファイル名を指定します。.m4a
拡張子はAAC音声に適したコンテナです。音声ストリームのコピーなので、動画を含むコンテナ(.mp4など)ではなく、音声専用のコンテナを指定するのが一般的です。
これらの例からわかるように、-c copy
はストリームタイプごとに指定することも、全てのストリームに一括で指定することも可能です。複数のストリームタイプを扱う場合、-c copy
を一つだけ指定するのが最もシンプルですが、特定のストリームタイプにのみcopy
を適用したい場合は-c:v copy
, -c:a copy
のように個別に指定する必要があります。また、copy
しないストリームはデフォルトのエンコーダーが使用されるか、明示的にエンコードオプションを指定する必要があります。
コンテナ形式の変更
copy
モードの最も一般的な用途の一つは、コンテナ形式の変更です。入力ファイルと出力ファイルで拡張子(コンテナ形式)を変えるだけで、内部のストリームをコピーしつつ、コンテナを変換できます。
例:MKVをMP4に変換 (中身はそのまま)
bash
ffmpeg -i input.mkv -c copy output.mp4
例:MOVをMP4に変換
bash
ffmpeg -i input.mov -c copy output.mp4
これらのコマンドは、入力ファイルからストリームを抽出し、再エンコードせずにそのまま出力ファイルにmuxingします。成功するかどうかは、入力ファイルのコーデックが出力先のコンテナ形式でサポートされているかどうかに依存します。
ffprobeによる互換性の確認:
ファイルに含まれるコーデックを確認するには、ffprobe
が役立ちます。
bash
ffprobe -i input.mkv
出力の Stream #0:0(eng): Video:
や Stream #0:1(eng): Audio:
の行に、h264
, hevc
, aac
, dts
, opus
など、使用されているコーデック名が表示されます。出力したいコンテナ(例: MP4)がこれらのコーデックをサポートしているかを確認してからcopy
を行うのが安全です。一般的に、MP4コンテナはH.264 (AVC), H.265 (HEVC), MPEG-4 Part 2 (DivX/Xvid), AAC, MP3などのコーデックをサポートしています。MKVはより多くのコーデックをサポートしている柔軟なコンテナです。
基本的には、元のファイルのコーデックが、新しいコンテナでも一般的なものであれば、-c copy
でコンテナを変更できます。
第4章:ffmpeg copy の応用テクニック
基本を押さえたところで、FFmpegのcopy
モードを使ったより実践的で応用的なテクニックを見ていきましょう。これらのテクニックは、主に-map
オプションと組み合わせて、入力ファイルから特定のストリームを選択、削除、または並べ替えたり、メタデータを操作したりすることを含みます。
特定のストリームのみをコピー/選択 (-map
オプション)
入力ファイルに複数の動画、音声、字幕ストリームが含まれている場合、デフォルトでは最初のストリームだけが選択されることがあります(またはFFmpegが最適なものを推測します)。出力ファイルにどのストリームを含めるか、あるいは含めないかを明示的に指定するには、-map
オプションを使用します。
-map
オプションの基本的な書式は -map <input_file_index>:<stream_specifier>
です。
<input_file_index>
: 複数の入力ファイルを指定した場合の、入力ファイルのインデックス(0から始まる)。通常、入力ファイルが1つの場合は0
です。<stream_specifier>
: ストリームを指定します。以下のような形式があります。v
: すべての動画ストリームa
: すべての音声ストリームs
: すべての字幕ストリームd
: すべてのデータストリームt
: すべての添付ファイルストリームv:<index>
: 指定したインデックス(0から始まる)の動画ストリームa:<index>
: 指定したインデックス(0から始まる)の音声ストリームs:<index>
: 指定したインデックス(0から始まる)の字幕ストリーム<type>:<index>
:<type>
にはv
,a
,s
など、<index>
はインデックス<input_stream_id>
: 入力ストリームのユニークなID (例:0:0
,0:1
,0:v:0
,0:a:1
)
例:入力ファイルのすべてのストリームをコピーして出力
これは-c copy
単体でも多くの場合デフォルトの動作ですが、明示的に指定する場合は-map 0
を使います。
bash
ffmpeg -i input.mkv -map 0 -c copy output.mp4
-map 0
: 入力ファイル0番目 (input.mkv
) の全てのストリームを選択します。
例:入力ファイルから特定の音声トラックを選択してコピー
入力ファイルに複数の音声トラック(例:日本語音声、英語音声)がある場合、特定の音声トラックだけを選択してコピーすることができます。ffprobe -i input.mkv
でストリームのインデックスを確認し、例えば2番目の音声トラック(インデックス1)を選択する場合:
bash
ffmpeg -i input.mkv -map 0:v:0 -map 0:a:1 -c copy output_english_audio.mp4
-map 0:v:0
: 入力ファイル0番目の最初の動画ストリーム(インデックス0)を選択します。-map 0:a:1
: 入力ファイル0番目の2番目の音声ストリーム(インデックス1)を選択します。-c copy
: 選択したストリームをコピーします。
このコマンドは、元の動画ストリームと、特定の音声トラックだけを持つ新しいファイルを作成します。他の音声トラックや字幕トラックは含まれません。
例:字幕トラックの扱い
字幕トラックもcopy
できます。ただし、画像ベースの字幕(例: DVDのVobSub, Blu-rayのPGS)は、それらをサポートするコンテナ(例: MKV)でないとコピーできません。テキストベースの字幕(例: SRTをmuxしたもの)は、より多くのコンテナでサポートされます。
入力ファイルに動画、音声、字幕トラックが含まれている場合、字幕トラックもコピーするには明示的にマップする必要がある場合があります(特に-map 0
を使わない場合)。
bash
ffmpeg -i input.mkv -map 0:v -map 0:a -map 0:s -c copy output_with_subtitles.mp4
-map 0:v
: 入力ファイル0番目のすべての動画ストリームを選択。-map 0:a
: 入力ファイル0番目のすべての音声ストリームを選択。-map 0:s
: 入力ファイル0番目のすべての字幕ストリームを選択。-c copy
: 選択した全てのストリームをコピー。
ストリームの削除 (-map -
オプション)
-map
オプションは、選択だけでなく削除にも使えます。-map -<stream_specifier>
のように指定すると、そのストリームタイプを除外できます。ただし、通常は前述の-vn
や-an
、あるいは含めたいストリームだけを-map
で指定する方がシンプルです。しかし、例えば特定の字幕トラックだけを削除したい場合などに-map -
が役立ちます。
例:特定の字幕トラックを削除
入力ファイルに複数の字幕トラックがあり、3番目の字幕トラック(インデックス2)だけを削除したい場合:
bash
ffmpeg -i input.mkv -map 0 -map -0:s:2 -c copy output_without_third_subtitle.mkv
-map 0
: 入力ファイルの全てのストリームをデフォルトで含めます。-map -0:s:2
: 入力ファイル0番目の3番目の字幕ストリーム(s:2
)を除外します。-c copy
: 残りのストリームをコピーします。
この方法で、削除したいストリーム以外を-map
で一つずつ指定する手間を省きつつ、特定のストリームだけをピンポイントで削除できます。
ストリームのマッピングと再配置(複数入力)
-map
オプションは、複数の入力ファイルから特定のストリームを選択して、一つの出力ファイルにまとめる際にも非常に強力です。
例:動画ファイルと別ファイルの音声トラックを結合
動画ファイル video.mp4
(動画トラックのみ) と、別のファイル audio.aac
(音声トラックのみ) がある場合に、これらを一つのMP4ファイルに結合したい場合:
bash
ffmpeg -i video.mp4 -i audio.aac -map 0:v:0 -map 1:a:0 -c copy output_combined.mp4
-i video.mp4
: 最初の入力ファイル(インデックス0)。-i audio.aac
: 2番目の入力ファイル(インデックス1)。-map 0:v:0
: 入力ファイル0番目の最初の動画ストリームを選択。-map 1:a:0
: 入力ファイル1番目の最初の音声ストリームを選択。-c copy
: 選択した動画ストリームと音声ストリームをコピーして結合。
このコマンドは、動画と音声のタイムコードが同期していることを前提とします。もし同期がずれている場合は、エンコードが必要になるか、タイムスタンプ調整のオプション(copyts
など)を検討する必要があります。
メタデータのコピーまたは操作 (-map_metadata
, -metadata
)
動画ファイルには、タイトル、アーティスト、作成日、エンコーダー情報などのメタデータが含まれていることがあります。copy
モードでは、これらのメタデータも一緒にコピーされることが一般的ですが、明示的に制御することも可能です。
-map_metadata <output_stream_specifier>:<input_stream_specifier>
: 入力ストリーム/ファイルのメタデータを、出力ストリーム/ファイルにマップします。-map_metadata 0:0
: 入力ファイル0番目のグローバルメタデータを、出力ファイルのグローバルメタデータにコピーします。-map_metadata -1
: すべてのメタデータを破棄します(コピーしない)。
-metadata <key>=<value>
: 出力ファイルに特定のメタデータを設定します。
例:入力ファイルのメタデータを全てコピーして出力
これはデフォルトの動作であることが多いですが、明示的に指定する場合。
bash
ffmpeg -i input.mp4 -c copy -map_metadata 0:0 output_with_metadata.mp4
-map_metadata 0:0
: 入力ファイル0番目のグローバルメタデータを、出力ファイルのグローバルメタデータにコピー。
例:入力ファイルのメタデータを全て破棄して出力
bash
ffmpeg -i input.mp4 -c copy -map_metadata -1 output_without_metadata.mp4
-map_metadata -1
: 入力ファイルのメタデータを全て破棄。
例:新しいメタデータを設定して出力
bash
ffmpeg -i input.mp4 -c copy -map_metadata -1 -metadata title="My New Title" -metadata artist="Unknown" output_new_metadata.mp4
-map_metadata -1
: 元のメタデータは破棄。-metadata title="My New Title"
: タイトルを「My New Title」に設定。-metadata artist="Unknown"
: アーティストを「Unknown」に設定。
これらのオプションをcopy
と組み合わせることで、再エンコードせずにメタデータだけを編集したファイルを作成できます。
チャプターの扱い (-map_chapters
)
動画ファイルには、チャプター情報が含まれていることがあります。チャプター情報もメタデータの一種として扱われます。
-map_chapters <input_stream_specifier>
: 入力ファイルのチャプター情報を出力ファイルにコピーします。-map_chapters 0
: 入力ファイル0番目のチャプター情報を出力ファイルにコピーします。-map_chapters -1
: チャプター情報を破棄します(コピーしない)。
例:チャプター情報をコピーして出力
bash
ffmpeg -i input.mkv -c copy -map_chapters 0 output_with_chapters.mp4
-map_chapters 0
: 入力ファイル0番目のチャプター情報をコピー。
チャプター情報も、出力先のコンテナがサポートしている必要があります。MP4やMKVはチャプター情報をサポートしています。
注意:フィルタリングはできない
繰り返しになりますが、copy
モードではフィルタリングや編集はできません。例えば、以下のようなコマンドはエラーになります。
“`bash
このコマンドはエラーになります!
ffmpeg -i input.mp4 -c copy -vf scale=640:-1 output_resized.mp4
“`
理由は、-vf scale=640:-1
(動画をリサイズするフィルタ)を適用するには、動画ストリームをデコードしてピクセルデータにアクセスする必要があるからです。copy
モードはデコードをスキップするため、フィルタリング処理を行うためのデータがありません。
フィルタリングや編集が必要な場合は、そのストリームに対してはcopy
モードを使わず、適切なエンコーダーを指定する必要があります。
“`bash
動画はリサイズして再エンコード、音声はコピー
ffmpeg -i input.mp4 -vf scale=640:-1 -c:a copy output_resized_audio_copied.mp4
“`
-vf scale=640:-1
: 動画ストリームにリサイズフィルタを適用(これにより、動画ストリームは再エンコードが必要になります)。-c:a copy
: 音声ストリームはコピーします。- 動画ストリームのエンコーダー(
-c:v
)を指定していませんが、この場合FFmpegは通常、出力コンテナに適したデフォルトの動画エンコーダー(MP4ならlibx264
など)を選択します。明示的に-c:v libx264
のように指定することも可能です。
このように、copy
モードは万能ではありませんが、その特性を理解し、必要に応じてエンコードと組み合わせることで、多くのシナリオで効率的な処理が可能になります。
第5章:ffmpeg copy を使用する際の注意点とトラブルシューティング
copy
モードは非常に便利ですが、原理的な制約や入力ファイルの状態によって問題が発生することがあります。ここでは、copy
を使用する際に注意すべき点と、よく遭遇する問題の対処法について解説します。
互換性の問題
最も一般的な問題は、入力ストリームのコーデックが出力先のコンテナ形式でサポートされていない場合です。
- エラーメッセージ例:
Could not find tag for codec [...] in stream #[...], falling back to 'none'.
あるいは[mp4 @ ...] Could not find tag for codec [...] in stream #[...] with codec id [...], failing.
のようなメッセージが表示され、処理が停止するか、特定のストリームがスキップされます。 - 原因: 入力ストリーム(例: VP9動画、FLAC音声)が、指定した出力コンテナ(例: MP4)で標準的にサポートされていないためです。MP4は比較的制約が多いコンテナです。MKVコンテナはより多くのコーデックをサポートします。
-
対処法:
ffprobe -i input_file
で入力ファイルのコーデックを確認します。- 出力したいコンテナ形式がそのコーデックをサポートしているか調べます(「MP4 support codecs」「MKV support codecs」などで検索)。
- もしサポートされていない場合は、そのストリームは
copy
せず、出力コンテナがサポートする別のコーデックに再エンコードする必要があります(例: VP9 -> H.264/H.265 for MP4, FLAC -> AAC/MP3 for MP4)。
“`bash
例:MKV (VP9動画, FLAC音声) を MP4 (H.264動画, AAC音声) に変換
動画と音声は copy できないため、再エンコードが必要
ffmpeg -i input.mkv -c:v libx264 -preset medium -crf 23 -c:a aac -b:a 192k output.mp4
“`
破損したファイルや非標準的なファイル
入力ファイルが破損している場合や、FFmpegが想定しない非標準的な構造を持っている場合、copy
が失敗したり、出力ファイルが壊れたりすることがあります。
- エラーメッセージ例:
[h264 @ ...] error while decoding MB [...]
,[mp4 @ ...] moov atom not found
など、デコードやコンテナ構造に関するエラーが表示されることがあります。 - 原因:
copy
モードは再エンコードを行わないため、入力ファイルの構造的な問題や破損もそのままコピーしてしまいます。再生時に問題が発生していたファイルは、コピーしても問題が解消されるわけではありません。 - 対処法:
- 入力ファイルを別の信頼できるプレイヤーで再生してみて、ファイル自体に問題がないか確認します。
- FFmpegで一度完全な再エンコードを試してみることで、問題を修正できる場合があります(ただし画質・音質劣化は伴います)。
ffmpeg -i input.mp4 -c:v libx264 -preset fast -crf 28 -c:a aac -b:a 128k fixed.mp4
のように、画質を少し犠牲にして高速にエンコードしてみるなど。 - ファイルによっては、他のツールの方が修復に強い場合もあります。
可変フレームレート (VFR) の問題
可変フレームレート (Variable Frame Rate) の動画ストリームをcopy
すると、タイムスタンプの扱いの問題から、再生時に音ズレや映像の乱れが発生することがあります。これは、ゲーム画面録画などで発生しやすい現象です。
- 原因: VFRでは、フレームごとに表示時間が異なります。
copy
モードは元のタイムスタンプをそのまま引き継ぎますが、多くのプレイヤーや編集ソフトは固定フレームレート (Constant Frame Rate – CFR) を前提として設計されているため、VFRのタイムスタンプをうまく処理できないことがあります。 -
対処法: VFRの動画ストリームを正確に扱うには、通常、一度デコードしてCFRに変換しながら再エンコードする必要があります。
“`bash
VFRをCFR (30fps) に変換しつつ再エンコード
ffmpeg -i input_vfr.mp4 -r 30 -c:v libx264 -preset medium -crf 23 -c:a copy output_cfr.mp4
“`-r 30
: 出力フレームレートを30fpsに固定します。-c:v libx264 ...
: 動画ストリームは再エンコードします。-c:a copy
: 音声ストリームは問題なければコピーでOKです。
注意点として、
-r
オプションと-c copy
を動画ストリームに同時に指定することはできません。-r
はフレームレートを固定するために、デコード→フレームの複製/削除→エンコードという処理を必要とするためです。
タイムスタンプの問題 (-copyts
, -nots
)
FFmpegは通常、入力ファイルのタイムスタンプを維持しようとします(デフォルトでは-copyts
に近い動作)。しかし、入力ファイルに不連続なタイムスタンプが含まれている場合、あるいは複数の入力ファイルを結合する場合など、タイムスタンプの扱いに注意が必要です。
-copyts
: 入力ストリームのオリジナルのタイムスタンプをコピーします。これが多くのケースで望ましい動作ですが、不連続なタイムスタンプがある場合は問題を引き起こすこともあります。-nots
: 入力ストリームのタイムスタンプを無視し、0から始まる連続したタイムスタンプを新たに生成します。これにより不連続性は解消されますが、元のファイルに意図されたタイムスタンプ(例えば、ライブ配信でドロップしたフレームによるタイムスタンプのスキップなど)がある場合は、再生時に問題が発生する可能性があります。
通常、-c copy
を使用する場合は、タイムスタンプもそのままコピーされる(-copyts
に準じた動作)ため、特に意識する必要はありません。しかし、複数の入力を扱う場合や、タイムスタンプに関するエラーや警告が出た場合は、-copyts
や-nots
を試してみる価値があります。多くの場合、入力オプションとして-copyts
または-nots
を-i
の前に指定します。
“`bash
入力ファイルのタイムスタンプをそのままコピー
ffmpeg -copyts -i input.mp4 -c copy output.mp4
入力ファイルのタイムスタンプを無視し、新しいタイムスタンプを生成
ffmpeg -nots -i input.mp4 -c copy output.mp4
“`
タイムスタンプの問題は複雑な場合があり、入力ファイルの特性に依存します。基本的なcopy
の使い方ではほとんど意識する必要はありませんが、知っておくとトラブルシューティングに役立ちます。
FFmpegのバージョンによる違い
FFmpegは活発に開発が進められており、新しいバージョンでは新しいコーデックや機能がサポートされたり、既存のオプションの挙動が改善されたりすることがあります。古いバージョンのFFmpegを使用している場合、特定のコーデックのcopy
がサポートされていなかったり、特定のオプションが利用できなかったりする可能性があります。
- 対処法: 可能であれば、常に最新版のFFmpegを使用することをお勧めします。公式ウェブサイト (ffmpeg.org) からビルド済みのバイナリを入手するか、ソースコードからビルドできます。
これらの注意点やトラブルは、copy
モードに限らずFFmpeg全体に共通する部分もありますが、copy
モードの「中身をそのままコピーする」という特性上、入力ファイルの問題がそのまま出力ファイルに引き継がれやすいという点は特に意識しておく必要があります。
第6章:ffmpeg copy を活用できる具体的なシナリオ
FFmpegのcopy
モードは、その高速・無劣化という特性から、様々な動画・音声処理のシナリオで強力なツールとなります。ここでは、具体的な活用例をいくつかご紹介します。
-
コンテナ形式の変換:
- 例: MKVファイルをMP4に変換したい。MKVは多くのコーデックに対応していますが、MP4の方がより多くのデバイスやソフトウェアで再生互換性があります。中身の動画・音声コーデックがMP4でサポートされていれば、再エンコードなしで変換できます。
bash
ffmpeg -i input.mkv -c copy output.mp4 - 例: MOV (QuickTime) ファイルをMP4に変換したい。特にiPhoneなどで撮影した動画はMOV形式ですが、これを編集ソフトで扱いやすいMP4にしたい場合に便利です。
bash
ffmpeg -i input.mov -c copy output.mp4
- 例: MKVファイルをMP4に変換したい。MKVは多くのコーデックに対応していますが、MP4の方がより多くのデバイスやソフトウェアで再生互換性があります。中身の動画・音声コーデックがMP4でサポートされていれば、再エンコードなしで変換できます。
-
不要なストリーム (音声、字幕、余分なトラック) の削除:
- 例: 複数の音声トラックや字幕トラックが含まれる動画ファイルから、特定のトラックだけを残したい、あるいは削除したい。
“`bash
英語音声と日本語字幕だけを残したい場合 (入力の英語音声がa:0、日本語字幕がs:1とする)
ffmpeg -i input.mkv -map 0:v:0 -map 0:a:0 -map 0:s:1 -c copy output_cleaned.mkv
bash
全ての音声トラックを削除したい場合
ffmpeg -i input.mp4 -c:v copy -vn -map 0:v -map 0:s -c copy output_no_audio.mp4
よりシンプルに
ffmpeg -i input.mp4 -map 0:v -map 0:s -c copy output_no_audio.mp4
``
-vnは動画トラックの削除、
-anは音声トラックの削除、
-snは字幕トラックの削除に使えますが、
-mapで必要なストリームだけを選択する方が一般的です。
-map 0:v -map 0:s`のように指定すれば、入力ファイルの動画ストリームと字幕ストリームのみを選択し、音声ストリームは自動的に除外されます。 - 例: 複数の音声トラックや字幕トラックが含まれる動画ファイルから、特定のトラックだけを残したい、あるいは削除したい。
-
複数の音声トラックからの選択または分離:
- 例: 5.1chサラウンド音声と2chステレオ音声が含まれるファイルから、2chステレオ音声トラックだけを抜き出して別のファイルにしたい。
“`bash
2chステレオ音声トラックが入力ファイルのa:1にある場合
ffmpeg -i input.mkv -map 0:a:1 -c copy output_stereo_audio.aac
動画は不要なので`-vn`オプションも付けると、より明確になります。
bash
ffmpeg -i input.mkv -map 0:a:1 -c copy -vn output_stereo_audio.aac
``
.aac`など、音声コーデックに適したものを指定します。
出力ファイルの拡張子は - 例: 5.1chサラウンド音声と2chステレオ音声が含まれるファイルから、2chステレオ音声トラックだけを抜き出して別のファイルにしたい。
-
メタデータのみの編集または削除:
- 例: ファイルに含まれる個人情報や撮影情報を削除したい、あるいはタイトル情報を追加したい。
“`bash
全てのメタデータを削除してコピー
ffmpeg -i input.mp4 -c copy -map_metadata -1 output_no_meta.mp4
bash
新しいタイトル情報を追加してコピー
ffmpeg -i input.mp4 -c copy -metadata title=”Holiday Video 2023″ output_titled.mp4
“` - 例: ファイルに含まれる個人情報や撮影情報を削除したい、あるいはタイトル情報を追加したい。
-
ビデオ編集ソフトウェアへの取り込み前の前処理:
- 例: 非対応のコンテナ形式(例: MKV)のファイルを、編集ソフトがサポートする形式(例: MP4)に変換しておきたいが、画質劣化は避けたい。
bash
ffmpeg -i input.mkv -c copy output.mp4
ただし、編集作業中に再エンコードが必要になる箇所(カット、エフェクト適用など)がある場合は、最終的な出力時にエンコードが発生します。これは、編集ソフトの機能によります(スマートレンダリングに対応しているかなど)。
- 例: 非対応のコンテナ形式(例: MKV)のファイルを、編集ソフトがサポートする形式(例: MP4)に変換しておきたいが、画質劣化は避けたい。
-
ネットワークストリームの録画 (ただし時間指定が必要):
- 例: 一定時間だけライブストリーム(例: RTMP)を無劣化でファイルに保存したい。
“`bash
60秒間だけRTMPストリームをMP4ファイルに保存
ffmpeg -i rtmp://server/live/stream -c copy -t 60 output.mp4
``
-t 60`: 記録時間を60秒に制限します。ライブストリームは無限に続くため、終了条件を指定しないとコマンドが終了しません。
*
この場合も、ストリームのコーデックが出力コンテナでサポートされている必要があります。 - 例: 一定時間だけライブストリーム(例: RTMP)を無劣化でファイルに保存したい。
これらのシナリオは、FFmpegのcopy
モードの強力さと汎用性を示しています。再エンコードという手間と劣化を伴うプロセスを回避することで、これらの作業を圧倒的に高速かつ高品質に行うことが可能になります。
第7章:さらに進んだcopyの活用(-ss
, -to
, -t
オプションとの組み合わせ)
copy
モードの最も一般的な用途の一つに、「動画ファイルの一部を切り出す(トリミング)」というタスクがあります。FFmpegでは、-ss
(開始位置)、-to
(終了位置)、-t
(期間)といったオプションを使って時間指定を行います。しかし、copy
モードとこれらのオプションを組み合わせる際には、非常に重要な注意点があります。
指定した時間範囲のみをコピー (トリミング)
特定の時間範囲だけを抜き出してcopy
する場合、コマンドは以下のようになります。
“`bash
開始時刻から終了時刻までをコピー (例: 10秒から20秒まで)
ffmpeg -i input.mp4 -ss 10 -to 20 -c copy output_trim.mp4
開始時刻から指定した期間だけをコピー (例: 10秒から15秒間)
ffmpeg -i input.mp4 -ss 10 -t 5 -c copy output_trim.mp4
“`
時間指定は、秒数 (-ss 10
), 時:分:秒
(-ss 0:00:10
), またはミリ秒やフレーム数でも可能です。
-ss
オプションの位置が重要!
ここで重要なのは、-ss
オプションを-i input.mp4
の前に置くか、後に置くかで、FFmpegの挙動が大きく変わるという点です。
-
-ss
を入力オプションとして使用する場合 (-ss ... -i input
):
bash
ffmpeg -ss 10 -i input.mp4 -to 20 -c copy output_trim_fast.mp4
この場合、FFmpegは入力ファイルを指定した開始時刻までシーク(スキップ)してから読み込みを開始します。このシークは非常に高速であり、copy
モードと組み合わせることで、指定した開始時刻から終了時刻までを高速にコピーできます。しかし、注意点があります。動画ストリームは、キーフレーム (Iフレーム) と呼ばれる独立した完全なフレームと、それ以降のフレーム (Pフレーム, Bフレーム) が差分情報として記録されています。シークは通常、指定時刻に最も近い前のキーフレームから開始されます。そのため、
-ss
で指定した開始時刻がキーフレームの位置と一致しない場合、出力ファイルは指定時刻より少し前のキーフレームから開始されることになります。指定した開始時刻から正確に始まるわけではありません。- メリット: 非常に高速。
copy
の速度メリットを最大限に活かせる。 - デメリット: 指定した開始時刻から正確に始まらない可能性がある(前のキーフレームから始まる)。
- メリット: 非常に高速。
-
-ss
を出力オプションとして使用する場合 (-i input -ss ...
):
bash
ffmpeg -i input.mp4 -ss 10 -to 20 -c copy output_trim_accurate.mp4
この場合、FFmpegは入力ファイルを先頭から全て読み込みます。そして、指定した開始時刻 (-ss 10
) に達するまでのフレームを破棄し、それ以降のフレームを出力します。この処理のためには、FFmpegは先頭から指定時刻までをデコードしてタイムスタンプを確認する必要があります。結果として、この方法では
copy
モードのデコード/エンコードスキップのメリットが失われ、処理速度が大幅に低下します。実質的に再エンコードと同じくらいの時間がかかります(あるいは、デコードだけを行って破棄する時間も加わるため、さらに遅くなることもあります)。また、-c copy
を指定しても、このケースでは正常に機能しないか、エラーになる可能性が高いです。-ss
を出力オプションに指定して正確なトリミングを行う場合、通常は動画ストリームも再エンコードが必要になります。- メリット: 指定した開始時刻からほぼ正確に始まる。
- デメリット:
copy
のメリットが失われ、処理が遅くなる。通常、再エンコードが必要になる。
copy
モードでの正確なトリミングの解決策
前述の通り、copy
モードの速度を活かしつつ正確なトリミングを行うのは困難です。しかし、一つの回避策があります。
-ss
を入力オプションとして使い、指定時刻より前のキーフレームから始まる高速なコピーを行う。
bash
ffmpeg -ss 10 -i input.mp4 -to 20 -c copy output_rough_trim.mp4
このoutput_rough_trim.mp4
は、例えば実際には9.5秒のキーフレームから始まっているかもしれません。-
出力された
output_rough_trim.mp4
の先頭の余分な部分(この例では9.5秒から10秒まで)を、別のツールやFFmpegの再エンコード機能を使って正確にカットする。“`bash
output_rough_trim.mp4 の先頭0.5秒をカット (再エンコードが発生)
ffmpeg -i output_rough_trim.mp4 -ss 0.5 -c:v libx264 -preset veryfast -crf 23 -c:a copy output_final_trim.mp4
“`この方法は最初のコピーが高速なので全体の時間は短縮される可能性がありますが、最終的なカット部分では再エンコードが必要になり、画質劣化の可能性や処理時間の増加が発生します。完璧な無劣化かつピクセル単位の正確なトリミングを
copy
モード単独で行うことは、原理的に難しいと理解しておく必要があります。
キーフレームとは? (簡単な解説)
動画はフレームの連続で構成されていますが、すべてのフレームが独立した画像データとして記録されているわけではありません。
- I-frame (Intra-coded frame) / キーフレーム: そのフレーム単独で完全な画像情報を持つフレームです。再生の基準となります。シークやカットは基本的にキーフレームから行われます。
- P-frame (Predicted frame): 直前のIフレームまたはPフレームとの差分情報で記録されるフレームです。
- B-frame (Bi-directional predicted frame): 前後のIフレームまたはPフレームとの差分情報で記録されるフレームです。
ファイルサイズを小さくするために、Iフレームの出現頻度は抑えられています。例えば、多くの動画では1秒間に1回(30fpsなら30フレームに1回)程度しかIフレームがありません。-ss
を入力オプションで指定した場合、FFmpegは指定時刻の直前のIフレームまでスキップし、そこから読み込みを開始します。そのため、指定時刻とIフレームの位置がずれていると、出力ファイルの開始位置もずれてしまうのです。
チャンク分割/ファイル分割
大きな動画ファイルを、copy
モードで無劣化かつ高速に小さなセグメントに分割することも可能です。これには、-ss
, -t
(または-to
) オプションを入力オプションとして使用します。
例:1時間の動画ファイルを5分ごとのセグメントに分割
“`bash
ffmpeg -ss 0 -i input.mp4 -t 300 -c copy output_part1.mp4
ffmpeg -ss 300 -i input.mp4 -t 300 -c copy output_part2.mp4
ffmpeg -ss 600 -i input.mp4 -t 300 -c copy output_part3.mp4
… 繰り返し
“`
-ss [開始秒]
: 開始位置を指定します。-t [期間秒]
: 期間を指定します。-i input.mp4
: 入力ファイル。-ss
は入力オプションとして-i
の前に置くことで高速なシークを行います。
この方法で分割されたファイルは、前述の-ss
の挙動により、各ファイルが指定された開始時刻の直前のキーフレームから始まる可能性があります。そのため、正確な時刻で分割したい場合は、分割後のファイルの先頭を再度トリミングするなどの後処理が必要になる場合があります。ただし、ライブストリームを固定時間で区切ってアーカイブする場合など、各セグメントが前のセグメントの終了時刻から厳密に開始する必要がないシナリオでは、この方法は非常に有効です。
第8章:他の無劣化処理との比較
動画処理における「無劣化」という言葉は、文脈によっていくつかの意味合いを持つことがあります。FFmpegのcopy
モードは確かに「無劣化」ですが、それ以外にも無劣化またはそれに近い処理方法が存在します。
-
FFmpeg
copy
(ストリームコピー):- 仕組み: 圧縮されたビットストリームをそのままコピー。
- 無劣化度: 完全な無劣化(データの変更なし)。
- 処理速度: 極めて高速(ファイルコピーに近い)。
- 機能: コンテナ変換、ストリームの選択/削除/並べ替え、メタデータ操作など。フィルタリングや内容の変更は不可。
- 用途: コンテナ変換、不要トラック削除、メタデータ編集など、内容を変更しない処理。
-
ロスレスエンコード (可逆圧縮):
- 仕組み: デコードした未圧縮データを、可逆圧縮コーデック(例: FFV1, H.264 Lossless, FLAC)を使ってエンコード。デコード→エンコードのプロセスを踏む。
- 無劣化度: 完全な無劣化(圧縮・展開しても元のデータに戻せる)。
- 処理速度: 遅い(通常の非可逆エンコードよりもさらに遅いことが多い)。
- 機能: フィルタリングや編集が可能。エンコード時に設定を調整できる。
- 用途: 編集の中間ファイル、高画質アーカイブ、特定の用途(例: アルファチャンネル付き動画)など。ファイルサイズは非常に大きくなる傾向がある。
-
スマートレンダリング / パススルー編集 (一部の編集ソフトウェア):
- 仕組み: 編集ソフトウェアの機能。カット編集など、動画内容が変更されていないセグメントは元のビットストリームをコピーし、トランジションやエフェクトが適用されている箇所など、内容が変更されている箇所だけを再エンコードする。
- 無劣化度: 内容を変更していない箇所は無劣化、変更している箇所は劣化の可能性あり(再エンコード)。
- 処理速度: 再エンコードが必要な部分に依存。
copy
よりは遅いが、全編再エンコードよりは速いことが多い。 - 機能: 編集作業が可能。
- 用途: カット編集などが主体のシンプルな編集作業。
these three methods:
* FFmpeg copy
is the fastest and truly lossless, but severely limited in function.
* Lossless encoding is also truly lossless and allows processing, but is very slow and produces huge files.
* Smart rendering is a feature of NLEs, offering a compromise between speed and function, but is not strictly lossless for all parts.
FFmpegのcopy
モードは、これらの無劣化(または準無劣化)処理の中で、最も速度と低負荷に特化した方法です。内容を一切変更しないという強い制約がある代わりに、他の追随を許さない高速性を提供します。動画処理ワークフローにおいて、どの処理が無劣化で可能か、どの処理は再エンコードが必要かを判断し、copy
を適切に組み合わせることで、効率と品質の両立を図ることができます。
例えば、「撮影した動画ファイルを、編集ソフトに取り込みやすいコンテナに変換し、不要な音声トラックを削除する」という前処理には、copy
モードが最適です。その後の編集作業でカットや色調補正を行う箇所は編集ソフトが再エンコードしますが、そうでない箇所は元の品質を維持したまま最終出力される可能性があります(編集ソフトのスマートレンダリング機能による)。
第9章:まとめと今後の展望
この記事では、FFmpegの強力な機能であるcopy
モードについて、その原理から基本的な使い方、応用テクニック、そして使用上の注意点までを詳細に解説しました。
copy
モードの重要なポイントを改めてまとめます。
- 原理: 動画・音声の圧縮されたビットストリームをそのままコピーする。デコードもエンコードも行わない。
- メリット:
- 無劣化: 画質・音質の劣化が一切ない。
- 超高速: ファイルコピーに近い速度で処理が完了する。
- 低負荷: CPU/GPUリソースをほとんど消費しない。
- 主な用途:
- コンテナ形式の変換(対応するコーデック間)
- 不要なストリーム(音声、字幕など)の削除/選択
- 複数のストリームのマッピング/再配置
- メタデータやチャプターの操作
- 高速なファイル分割(キーフレームの制約あり)
- 制約:
- フィルタリングや編集は一切できない。
- 入力ストリームのコーデックが出力コンテナでサポートされている必要がある。
- 入力ファイルの構造的な問題(VFR、破損など)もそのままコピーされる可能性がある。
-ss
と組み合わせて正確なトリミングを行うのは難しい(キーフレームの制約)。
FFmpegのcopy
モードは、万能薬ではありません。しかし、その「無劣化・高速」という唯一無二の特性は、多くの動画処理タスクにおいて非常に有効な切り札となります。再エンコードが必要な処理と、copy
で十分な処理を見極め、適切に使い分けることが、効率的かつ高品質なメディア処理ワークフローを構築する鍵です。
FFmpegは常に進化しています。新しいコーデックやコンテナ形式への対応が進み、既存の機能も改善され続けています。公式ドキュメントは非常に包括的ですが、その情報量の多さから初心者には難解に感じられるかもしれません。しかし、多くのユーザーがいるため、オンラインフォーラムやコミュニティで情報を交換したり、疑問点を質問したりすることも可能です。
この記事が、あなたがFFmpegのcopy
モードを理解し、自信を持って使いこなすための一助となれば幸いです。ぜひ実際にFFmpegをインストールし、この記事で学んだコマンドを試してみてください。きっと、その処理速度と無劣化の品質に驚くはずです。
メディア処理の世界は奥深く、FFmpegはその探求における強力な羅針盤となります。copy
モードはその中でも基本中の基本であり、知っておくだけで作業効率が劇的に向上する強力なテクニックです。この知識を活かして、あなたのメディアライフをより快適で高品質なものにしてください。
付録:よく使うffmpeg copy関連オプション チートシート
最後に、この記事で紹介したcopy
モード関連のよく使うオプションをまとめておきます。
-i <input_file>
: 入力ファイルを指定します。-c copy
/-codec copy
: 全てのストリームをコピー(再エンコードしない)します。-c:v copy
: 動画ストリームのみコピーします。-c:a copy
: 音声ストリームのみコピーします。-vn
: 動画ストリームを出力に含めません(削除)。-an
: 音声ストリームを出力に含めません(削除)。-sn
: 字幕ストリームを出力に含めません(削除)。-map <input_specifier>[:<stream_specifier>]
: 出力に含めるストリームを指定します。- 例:
-map 0
(入力ファイル0番目の全ストリーム) - 例:
-map 0:v:0
(入力ファイル0番目の最初の動画ストリーム) - 例:
-map 0:a:1
(入力ファイル0番目の2番目の音声ストリーム) - 例:
-map 0:s
(入力ファイル0番目の全字幕ストリーム)
- 例:
-map -<stream_specifier>
: 特定のストリームを除外します。- 例:
-map -0:s:2
(入力ファイル0番目の3番目の字幕ストリームを除外)
- 例:
-map_metadata <output_specifier>:<input_specifier>
: メタデータをコピーします。- 例:
-map_metadata 0:0
(入力ファイル0番目のグローバルメタデータを出力にコピー) - 例:
-map_metadata -1
(全てのメタデータを破棄)
- 例:
-metadata <key>=<value>
: 出力ファイルにメタデータを設定します。- 例:
-metadata title="My Video"
- 例:
-map_chapters <input_specifier>
: チャプター情報をコピーします。- 例:
-map_chapters 0
(入力ファイル0番目のチャプター情報をコピー) - 例:
-map_chapters -1
(チャプター情報を破棄)
- 例:
-ss <position>
: 時間指定オプション。-ss <position> -i input
: 入力の開始位置をシーク(高速だがキーフレーム制限あり)。-i input -ss <position>
: 出力の開始位置を指定(正確だが低速、通常再エンコード必要)。<position>
は秒数、HH:MM:SS[.xxx]
形式などで指定。
-to <position>
: 終了時刻を指定します。-t <duration>
: 期間を指定します。
これらのオプションを組み合わせて使うことで、FFmpegのcopy
モードの能力を最大限に引き出すことができます。
これで、「ffmpeg copy完全ガイド:高速・無劣化な動画処理の切り札」の詳細な記事は完了です。約5000語の要件を満たしているかと思います。この内容が、読者の皆様のFFmpeg活用に役立つことを願っています。