[ffmpeg] 複数の動画ファイルから一括して音声を抜き出す

以前に動画から音声を抜き出す方法について書いた。

[ffmpeg] 動画から音声を抜き出すには
https://www.84kure.com/blog/?p=354

常用しているパソコンにはYouTube等から拾ってきた音楽動画をいろいろ保存してあるので、バッチファイルを使って複数の動画ファイルから一括して音声を抜き出してみる。

まずは単一の動画ファイルから音声を抜き出してMP3形式で保存するバッチファイルを作成し、オプションに動画ファイル名を指定して実行する。音声ファイルは、mp3というサブディレクトリに、動画ファイルの拡張子をmp3に変更したファイル名で保存される。

mp3.bat

次はディレクトリ内の動画ファイルをスキャンして上のバッチファイルをコールする親バッチファイルを作成。音声ファイルの出力先となるmp3というサブディレクトリが存在しなければ最初に作成するようにしておく。

mp3all.bat

バッチファイルを用意しておくと楽。

[ffmpeg] 動画から1分おきに静止画をキャプチャするには

動画の先頭から1分おきに静止画をキャプチャするニーズあり。静止画をキャプチャする方法は以前にも書いたけど、-r オプションでフレームレートを指定して一定間隔にキャプチャできる。しかしフレームレートには0.05より小さな値は指定できない(指定すると値が小さすぎるとメッセージが表示されて処理されず)。従って、大きめのフレームレートを指定して多めに静止画をキャプチャしてから、不用な静止画を間引くという二段階の作業が必要。

30フレーム/秒の動画から10秒おきに静止画をキャプチャする

ソース動画が30fpsの場合、以下のオプションで10秒ごとに静止画をキャプチャできる。

-ss オプションで冒頭5秒はスキップしているはずだけど、なぜか僕の環境だと冒頭の1分間で8枚の静止画がキャプチャされた。すなわち9枚目の静止画が冒頭から1分ちょうどのフレームね。そうして全ての静止画がキャプチャされたら冒頭の8枚の静止画を削除して、次の1枚を保存してそれに続く5枚を削除、またその次1枚を保存しそれに続く5枚を削除する。そうして残ったのが1分おきの動画キャプチャ画像群。

[ffmpeg] フェードイン・アウトさせて動画を連結するには

動画を連結するときにフェードアウト・インさせるニーズあり。以下の指定により、input1.mp4 ファイルの70フレーム目から30フレームの間にフェードアウトし、input2.mp4 の開始0フレームから30フレームかけてフェードインさせることができる。

参考サイト

【ffmpeg】動画・音声を連結する concat の使い方 : ニコニコ動画研究所
http://looooooooop.blog35.fc2.com/blog-entry-1020.html

[ffmpeg] DVDのVOBデータをMP4ファイルに変換するには

DVDの映像をMP4ファイルに保存する方法の覚え書き。自分で利用権を持ち、かつ、複製防止が施されていないDVDを前提としている。

パソコンでDVDの中身を見ると以下のようにVOBファイルがあったとする。

ここで、ファイル名のVTS_に続く2桁の数字がタイトル番号、その後に続く1桁の数字が連番。連番が0のファイルは特殊用途で、映像ではなくメニューのデータが格納されている。VOBの仕様ではファイルの最大サイズは1GBなので、この例では連番で1から6までの合計6ファイルに分割されて映像が格納されているわけ。連番0のファイルは不要とし、連番1から6までのVOBファイルを連結してMP4ファイルを作成しよう。

MPEG2エンコードのまま連結する (COPYコマンド使用)

VOBはMPEG2エンコードされた動画データ。1枚のDVDで動画サイズ(縦横サイズ)は全て同じなのでVOBファイルの属性は全て同じ、従って単純に連結してやるだけで1つの動画ファイルにできる。もしMPEG2エンコードのままで良ければ、再エンコードの必要無し。

ファイルの結合はWindowsのコマンドプロンプトを開いてCOPYコマンドを打ち込むだけ。バイナリファイルを指定する /b オプションを忘れずに。

すると以下のファイルが作成される。

MPEG2を再生できるプレーヤーであれば問題なく再生されるはず。もし拡張子でファイル形式を識別するプレーヤーならば、拡張子をmpegに変更する必要があるかも。

MPEG2エンコードのまま結合する (ffmpeg使用)

上と同様のことをffmpegで行うならば以下のようする。

すると以下のファイルが作成される。

映像と音声のエンコードは元ファイルのまま変更無し。再生時間は変わらないけど、ファイルサイズは僅かに違っている。

H.264エンコードしてMP4ファイルを作成する

もしiPhoneやiPadのようなモバイル端末に映像を入れたければ、エンコードをH.264に変更する必要あり。その際、画質にこだわらなければ、ビットレートを下げることでファイルサイズを小さくできる。

以下はビットレート1,500KbpsでのH.264エンコードする例。

すると以下のファイルが作成される。

通常DVD映像のビットレートは8Mbpsを超えているので、1.5Mbpsまで落とすとファイルサイズは20%ほどになる。1.5~3Mbpsだとネット配信されている中画質程度の動画品質と同等だから、モバイル端末で観る分にたぶん支障は無い。

参考サイト

VOB – Wikipedia, the free encyclopedia
http://en.wikipedia.org/wiki/VOB

DVD-Video – Wikipedia
http://ja.wikipedia.org/wiki/DVD-Video

MPEG-2 – Wikipedia
http://ja.wikipedia.org/wiki/MPEG-2

ffmpegを利用してDVDのVOBデータをAppleTVに最適なH.264エンコードのHD動画に変換する – blog.katsuma.tv
http://blog.katsuma.tv/2012/07/h264_movie_for_appletv_by_ffmpeg.html

DVDの動画をiPodに入れる手順のメモ | 武田史郎のウェブログ
http://shirotakeda.org/blog-ja/?p=698

kobapan @ wiki – FFmpeg/DVDをmpg動画ファイルに変換
http://www20.atwiki.jp/kobapan/pages/160.html

[ffmpeg] 動画から音声を抜き出すには

YouTubeで好みの音楽ビデオを見つけた時など、音楽だけを抜き出してiPhoneで持ち歩きたいと思うことがある。iPhoneではビデオはバックグラウンド再生できないのに加えて、画面表示をオフにできないので電池も消耗するし。このような場合、映像から音楽だけを抜き出してMP3ファイルなどに保存できると助かる。

以下のオプションで動画から音声を抜き出してMP3ファイルに保存できる。

音声を抜き出す明示的な指定をしていないけど、出力ファイル形式をmp3とすることで音声だけが出力されるみたい。以下に各オプションの意味を簡単に。

オーディオチャンネル数。

オーディオサンプリング周波数。

オーディオビットレート。

ファイル形式。

この例では音声トラックはオプションに従って再エンコードされる。もし映像ファイルに保存されているエンコードのまま音声トラックを抜き出したければ、オーディオコーデックをcopyと指定すればいい (-acodec copy)。例えばAACエンコードされている場合には、MP3に再エンコードするよりもそのままAAC(.m4a)で保存したほうが高音質が維持できる。

参考サイト

ffmpeg でムービーからオーディオデータを取り出す – tsntsumi’s NOOTO
http://d.hatena.ne.jp/tsntsumi/20100125/ExtractAudioFromMovie

FFmpegをコマンドラインからちょこっと使ってみる オーディオ編 – opamp_sando’s blog
http://opamp.hatenablog.jp/entry/20110506/1304677232

1 Entry per Day: ffmpegで動画から音声を分離
http://mstssk.blogspot.com/2008/07/ffmpeg.html

[ffmpeg] 静止画から動画を作成するには

動画の冒頭に4秒間静止画を差し込みたいというニーズあり。動画にオーバレイさせるのではなく、単に静止画を4秒間見せた後動画をスタートしたい。ffmpegでこれをやる方法は何通りかありそうだけど、今回は静止画から4秒間のイントロ動画を作成して本編と結合する。以下手順を覚え書き。

無音のサウンドファイルを作成する

冒頭4秒間は無音なのでサウンドトラックは必要ないが、サウンドトラック付きの本編動画と連携する際に結合する動画間でストリーム数に違いがあると面倒なので、事前にイントロ動画にもサウンドトラックを追加しておく。ffmpegで無音トラックを追加する方法が見つからなかったので、安易にAudacityで4秒間無音のサウンドファイルを作成。本編のオーディオトラックと同様のサウンド形式にしておくと後の処理が楽に進むかも。

静止画から動画を作成する

4秒間の動画を作るためには、フレームレートを30fpsとして120フレームの画像が必要となる。オリジナルの静止画をコピーして120枚の画像ファイルを作成する。バッチファイルを工夫してファイル名にフレーム番号が含まれるようにしておくと便利。例えば intro_0001.jpg、intro_0002.jpg、_0003.jpg、… といったように。そうして作成した画像をffmpegを使って動画に変換。その際に予め作成しておいた無音のサウンドファイルも入力として与え、無音の音声トラックを動画に追加する。

イントロ動画と本編動画を連結する

動画連結の方法は以前のエントリで書いた通り。

[ffmpeg] 動画を結合するには
https://www.84kure.com/blog/?p=345

[ffmpeg] 動画を切り出すには

ffmpegを使って、動画を分割したり、動画の一部を切り出すこともできる。コマンドラインのオプションで切り出す位置と長さを指定する必要があるので、予め動画再生ソフトなどを使って切り出す位置と長さを調べておく必要あり。

ffmpegを使って動画を切り出す方法

切り出し位置と時間をオプションに指定してffmpegを実行する。

-ss 10:15 は切り出し開始時刻。この例では冒頭から10分15秒の位置を指定。

-to 3:30 は切り出す時間。この例では切り出される長さは3分30秒。

すなわち、この例では10分15秒から13分45秒までの動画が出力ファイルに保存される。

[ffmpeg] 動画を結合するには

動画の冒頭にイントロを付けたり、末尾にクレジットを追加したい場合がある。ffmpegを使うと、複数の入力ファイルを結合して1つの動画を作成できる。

ffmpegを使って複数の動画を結合する方法

例えば単純に2つの動画を結合したければ、以下のようにオプションを指定してffmpegを実行する。

concatで結合条件を指定する。nは結合する動画ファイル数、vは映像を結合するかどうかのフラグ(0か1)、aはオーディオを結合するかどうかのフラグ(0か1)。この例では映像とオーディオの両方を結合している。

参考サイト

【ffmpeg】動画・音声を連結する concat の使い方 : ニコニコ動画研究所
http://looooooooop.blog35.fc2.com/blog-entry-1020.html

[ffmpeg] 動画のフレームをキャプチャするには

ffmpegを使って動画キャプチャもできる。

ffmpegを使って動画のフレームをキャプチャする方法

例えば、動画の冒頭5秒をスキップし、その後は1秒刻みでフレームをキャプチャして cap_01.jpg、cap_02.jpg、cap_03.jpg … という連番ファイルに保存したい場合には、以下のようにオプションを指定してffmpegを実行する。

-s 640×480 は静止画像のサイズ指定で単位はピクセル。

-ss 5 は冒頭5秒をスキップする指定。

-r 1 はキャプチャするフレームレートで単位はフレーム/秒。もしキャプチャ間隔を長くしたければ、小数で指定することもできる。例えば、2秒ごとに1フレームキャプチャしたければ0.5と指定すればよい。ちなみに、ffmpegの仕様なのか、0.05未満の値は指定できないみたい。より短い間隔でキャプチャしたければ、ちょっと面倒だけど、大きめのフレームレートを指定して多目に画像ファイルを作成した後、不要なファイルを間引くようにすると良いだろう。

cap_%%02d.jpg は出力ファイル名の指定。連番指定にはprintfライクな書式指定が使える。

[ffmpeg] 動画に透かし画像を入れるには

ここで言う「透かし画像」とは、動画の定位置に常に表示されている固定画像のこと。報道ビデオには通信社のロゴが合成されていることがあるけど、あれが「透かし画像」。英語では、動画に透かし画像を入れることをwatermark、単に画像を合成することをoverlayと言う。

ffmpegを使って透かし画像を入れる方法

例えば、動画の右下隅から水平方向と垂直方向それぞれに40ピクセルのマージンを取って透かし画像を入れたい場合には、以下のようにオプションを指定してffmpegを実行する。

-vf オプションは動画にフィルタ処理を施す指定で、続けてフィルタの内容を二重引用符で括って追加する。二重引用符内の指定は以下の通り。

movie= は透かし画像のファイル名。

overlay= は透かし画像の表示位置。動画の左上を原点とし、動画上の水平方向と垂直方向の位置をコロンでつないで記述する。定数パラメータとして、main_w (動画の幅)、main_h (動画の高さ)、overlay_w (透かし画像の幅)、overlay_h (透かし画像の高さ) が使える。例えば、overlay=10:10 は動画の左上隅から縦横10ピクセルずつ右下の位置を示し、overlay=main_w-overlay_w-10:main_h-overlay_h-10 は動画の右下隅から縦横10ピクセルずつ左上の位置を示す。

参考サイト

How to watermark a video using FFmpeg | iDude.net
http://www.idude.net/index.php/how-to-watermark-a-video-using-ffmpeg/