動画ファイルとは
そもそも動画ファイルの構造はどうなってるのよという話。全ての基本なので今更感もあるのだけど、ここをわかっていないとffmpegは使いづらいので書いてみる。図で表すとこんな感じ。
大雑把に言えば、映像と音声をコンテナが包んでいる感じ*1。普段見慣れているflvとかaviとかmovとかいったファイル形式の多くはコンテナの種類だったわけですね*2。
動画ファイル内部では映像と音声は互いに独立していて、コンテナがメタ情報として同期情報を持っているので、普通に再生すれば映像と音声が合っていても、ふとした拍子にズレてしまうのは映像と音声の間で同期が取れなくなってしまうことが原因(だと思う)。逆に、映像と音声が独立しているからこそ、動画ファイルから映像だけ抜き出す、とかBGMだけ取ってくるというのが簡単にできるわけですね。
なお、コンテナはコンテナの上に載せることのできる映像や音声の形式を選びます。例えば、MP4コンテナにwmv形式の映像は載せられません*3。従って、映像や音声の形式を変換する際にはその形式を受け入れ可能なコンテナを選択する必要があります。逆に、複数の形式のコンテナが対応している映像形式の場合は無劣化でファイル形式(=コンテナ形式)を変換することが可能です。
また、コンテナには必ずしも映像・音声の両方を入れなければならないというわけではなく、例えば、かつて Ogg/Vorbis と言われた Vorbis 形式では、コンテナがOgg、音声はVorbisですが映像データは含まれません。
コーデックとはなんぞや
コーデックとは COder/DECoder の頭文字が原義だそうです。つまり、なにがしかのモノを別の形に変換するためのアルゴリズムのことですね。
もともとの、と言うと何が元なのかわかりにくいので、例えばDVカメラで撮ったムービーをパソコン上でノンリニア編集することを考えてみます。DVカメラからパソコンに取り込んだ映像と音声は、計約27Mbpsです。秒間27Mbit、すなわち一秒間あたり約3.3MB必要なわけです。10分間なら2GB弱ですね。
さすがにいくらHDDが安くなり、光ファイバ早いよねといっても、これだけのデータ量を持つファイルを他のファイルと同じように扱うには無理があります。そこで、何らかの手段を使って、このムービーファイルを破綻なくより扱いやすいサイズにまで減量してやらねばなりません。そこで活躍するのがこのコーデックたちな訳です。既にお気づきかと思いますが、上で映像・音声について〜形式といっていたものの正体ですね。
有名どころを挙げると、映像ではwmv、H.264、DivX、Xvid、theora、Mpeg-4、Mpeg-2、flv*4、音声ではmp3、flac、vorbis、wma、atracなどがあります。なお、 Template:圧縮フォーマット - Wikipedia にはコンテナの形式、映像コーデック、音声コーデックが見やすく纏まっているので、理解の一助になるでしょう。