ffmpeg_rev.47984の自分用コンパイルと更新ライブラリのメモ

前にコンパイルしたffmpegは、ソースが少し前に取得したものだったので
その間に、ライブラリが色々と更新されてました。
という訳で、ffmpegのライブラリを全て更新してコンパイル。

あくまで自分用なので、自分のCPUに最適化しています。

あと、「お気に入りの動画を携帯で見よう」さんのサイトによれば
x264_rev.2230には、バグがあるとのこと。

x264 rev.2230のこだまでしょうか?いいえバグです。 お気に入りの動画を携帯で見よう
ってもうコンパイルしてしまった…。
でも、エンコは正常みたいで特に分かった様子はなさそう。
またコンパイルするの面倒なので、次のリビジョンまで待ちます。
続きを読む

音楽ファイルをfdk-aacに変換

前回の記事で、fdk-aacを組み込んだffmpegをコンパイルしました。
そういう訳で今回は、そのffmpegでfdk-aacを使ってみます。

ここでは ffmpeg.exe 単体で変換しますが
携帯動画変換君などのフロントエンドを使ったり
一連の処理をバッチファイルにまとめて、ドラッグ&ドロップで変換したりしてもいいと思います。
(というか頻繁に使う場合は、そちらの方が楽)

fdk-aacに変換

まずffmpegがある場所でコマンドプロンプトを開く。
( [Shift] を押しながら右クリックすれば、右クリックメニューに「コマンドウィンドウをここで開く」あるのでそれで開く)

変換する音楽ファイルは、CDから音源で「ラデツキー行進曲」

恐らく、名前を知ってる人も多いと思いますが、知らない人でも曲を聴けば一度は
聴いた覚えがあるはず。こんな曲です↓

そんな訳でコマンドライン。256kbpsで変換。
今回は単なるテスト目的なのでデフォルトの AAC-LC を使います。
ffmpeg -y -i "ラデツキー行進曲_作品228.wav" -vn -acodec libfdk_aac -ac 2 -vol 256 -ab 256k "OutputFile21.m4a"

snapshot_fdk_001
日本語のファイル名なので思いっきり文字化けしてますが
ちゃんと変換されます。

出力されていたら、無事完了。

確認のためPSPに入れたところ、きちんと再生されました。
これで、iPodやPSP他ミュージックプレイヤーなどに入れて持ち運べますね。

あとプロファイル指定を行いたい場合は、以下のようにコマンド追加。
例えば、HE-AACなら
-profile:a aac_he

-profileオプションを指定しない場合
自動的にデフォルト値である AAC-LC になります。

FDK-AACを組み込んだffmpegをコンパイルしてみた

二ヶ月ちょっと前にx264をWindows上でコンパイルしてみましたが
記事の最後にも書いてある通り、ffmpeg もコンパイルしてみました。

折角なので高音質?と噂のFDK-AACライブラリ(AACエンコーダ)も一緒にffmpegに組み込んでいます。

もともと、ネット上で配布されているffmpegは
faacやfdk-aacなどの一部のライブラリが含まれていません。

何故ならfaacやfdk-aacはオープンソースではあるものの、「Non-Free」なライブラリであり
これらを含む実行ファイルの再配布ができないからです。

一言で言えば、ライセンス上の関係ですね。

つまり、faacやfdk-aacを利用するには
自分でソースコードから faac や fdk-aac といったライブラリを含むffmpeg をコンパイルする必要があります。

そんな訳で、fdk-aacを利用してみたいと思い、自分用にコンパイルした次第。
環境はx264をコンパイルした時と同じ MinGW / MSYS。

まず、ここからfdk-aacをダウンロード

$ tar zxvf fdk-aac-0.1.1.tar.gz
$ cd fdk-aac-0.1.1
$ ./configure
$ make
$ make install

後は、ffmpegの./configure オプションに「–enable-nonfree –enable-libfdk-aac」を追加して make してffmpegをコンパイルすればOK。

ffmpegのコンパイルについては、長くなってしまうので今回は割愛。
まとまり次第、書き留めたいけど面倒なんだよなー。

携帯動画変換君で音楽ファイルに変換する設定

携帯動画変換君&ffmpegネタ。
FLVやAVIといった動画ファイルから、各種音楽ファイルに変換する設定。

動画ファイルをMP3に変換する場合

ビットレートを変更したい場合は-ab 128k の部分を書き換え。
以下の例では 128kbps 設定

[Item0]
Title=MP3/128kbps
Command0=""<%AppPath%>\cores\ffmpeg" -y -i "<%InputFile%>" -vn -acodec libmp3lame -ac 2 -vol 256 -ar 44100 -ab 128k "<%OutputFile%>.mp3""

Ogg Vorbisに変換する場合

ビットレートを変更したい場合は-ab 128k の部分を書き換え。
以下の例では 128kbps 設定

[Item0]
Title=OGG/128kbps
Command0=""<%AppPath%>\cores\ffmpeg" -y -i "<%InputFile%>" -vn -acodec libvorbis -ac 2 -vol 256 -ar 44100 -ab 128k "<%OutputFile%>.ogg""

WAVファイル(リニアPCM)に変換する場合

無圧縮の音楽ファイルになり容量が大きいので注意。

[Item0]
Title=WAV(PCM)/stereo
Command0=""<%AppPath%>\cores\ffmpeg" -y -i "<%InputFile%>" -vn -acodec pcm_s16le -ac 2 -vol 256 -ar 48000 -f wav "<%OutputFile%>.wav""

WMAに変換する場合

ビットレートを変更したい場合は-ab 128k の部分を書き換え。
以下の例では 128kbps 設定

[Item0]
Title=WMA/128kbps
Command0=""<%AppPath%>\cores\ffmpeg" -y -i "<%InputFile%>" -vn -acodec wmav2 -ac 2 -vol 256 -ar 44100 -ab 128k -f asf "<%OutputFile%>.wma""

まぁ、デフォルトの携帯動画変換君使ってる人はあんまりいないと思う。
既に、2005年12月を最後にずっと更新されてないしね。

使ってる人は大体、私みたいに設定を書き換えたりして
エンジンである ffmpeg を新しいのに入れ替えてる人くらいだよなぁ。

ffmpegを使いこなすには色々とコマンド覚えなきゃならないから
使ってる人はある意味何か拘りがある人だと思う(画質とか)。

ちょっと設定を書き換えるだけで、利用できるって便利だと思うんだけど
PCでネットやメールを使ったり、動画や音楽を変換してデジタルメディアプレイヤーに入れたり
とか一般的な使用用途だとそこまでする意義がないんだろうね。

ネットにはもっと簡単で手軽なフリーソフトがあるし。

最新ffmpeg用に変換君設定を書き換える(後編)

分割した前回の続き。
前回の記事はこちら…最新ffmpeg用に変換君設定を書き換える(前編)

-acodec aac -ac 2 -ar 48000 -ab 96 → -an
-acodec aac 指定のままだと現在ではffmpeg内蔵AACコーデックが指定されてしまう。
ffmpeg内蔵AACは音質があまり良くない。

これは、AAC指定のオプションが -acodec libaac に変わったり
結構前(たしか2009年5月頃)に、ライセンス絡みの問題で
faac コーデックを入れてffmpeg配布できなくなったり
aac変換出来なくなって、その後に新しくffmpeg内蔵aac(試験中なので音質はあまり良くない)が登場した為。

と言う事で高音質なAACに変換できる外部AACエンコーダを使う。
まずは NeroAACエンコーダーをダウンロード。→前に書いた記事を参照
ダウンロードしたら、解凍してWin32フォルダに入っている「neroAacEnc.exe」を
変換君の「coresフォルダ」に入れる。
続きを読む

最新ffmpeg用に変換君設定を書き換える(前編)

携帯動画変換君の設定ファイルを、現在の新しいffmpeg用の設定に
書き換える為の書き換え部分をメモ。

かなり長くなってしまったので、記事を分割しています。

携帯動画変換君のffmpegを入れ替える意味

携帯動画変換君には、動画変換の内部エンジンに
ffmpegと呼ばれるエンコーダが使われている。

ffmpegが、動画変換をする本体であり、携帯動画変換君は
ファイルをドラック&ドロップするだけで
ffmpegを手軽に使えるようにしたGUIフロントエンド。

要は、携帯動画変換君に動画ファイルをドラッグ&ドロップすると
設定ファイルに記述されている設定でffmpegを動かして動画変換してるってだけ。

しかし、携帯動画変換君で使われているffmpegは少し古く
一部新しいフォーマットに対応していない。
(これは、公式が2005年12月1日の0.34をリリースしてから更新していない為)

そこで、内部エンジンであるffmpegを新しいものと入れ替えて
新しいフォーマットに対応して変換できるようにするのがffmpegを入れ替える目的。

なんだけど、一番の問題はffmpegを動かす設定の書式が変わってしまっていて
古いffmpegと全く互換性がないという事。
なので、新しいffmpegに入れ替えても、そのままの設定では動かない。
続きを読む

ffmpegのヘルプをテキストに出力する

ffmpegは、高機能な動画変換ツールなんだけど
その代わりに膨大な数のオプションがある。

使い方が分からない場合や、詳しいオプションの説明を見たい場合は
こういうコマンドラインベースのソフトを使ってる人なら、当然ヘルプを見る。

だけど、あまりに膨大な数なので、コマンドプロンプト画面に全て載り切らない。

そんな時は、テキストファイルにオプションを出力して
テキストファイルで見てみると便利。

ffmpeg でヘルプファイルにコマンドを出力するには
コマンドプロンプトから以下の様に入力する。
ffmpeg -h > commands.txt

因みに、比較的新しいffmpeg であれば、ヘルプを出力するオプションは-hだけでなく
-?-help--helpなどでも可能。

私は、毎度毎度コマンドプロンプトから入力するのも面倒なので
以下のバッチファイルにしてしまっています。
@echo off
if exist commands.txt (del commands.txt)
if exist formats.txt (del formats.txt)
if exist codecs.txt (del codecs.txt)
ffmpeg -h > commands.txt
ffmpeg -formats > formats.txt
ffmpeg -codecs > codecs.txt
exit

このバッチファイルを ffmpeg のあるフォルダで実行すれば
「commands.txt」「formats.txt」「codecs.txt」の3つのファイルが出力される。

「commands.txt」は、ffmpegで利用可能なオプションコマンド一覧。

「formats.txt」は、ffmpegが出力可能なフォーマット(動画・音声を含包するコンテナの形式)一覧。
例えば、aviとかflvとかmp4とかoggとか。

「codecs.txt」は、ffmpegが変換可能なコーデック(動画・音声形式の種類)一覧。
例えばH.264とかとかmp3とかvorbisとか。

ffmpegのヘルプを出力したファイルを見てみたら、なんと1400行以上になってた!
確か、携帯動画変換君に使われているffmpegは、200~300行程度だったから
かなり増えてるな…というか完全に多過ぎてカオスな状況。

ffmpegの一部オプションの書式が変わった

久しぶりのffmpegネタ。

「お気に入りの動画を携帯で見よう」さんのサイトによれば
ffmpegの一部オプションが変わっているみたいです。

FFmpeg rev.37798 ダウンロード お気に入りの動画を携帯で見よう
http://blog.k-tai-douga.com/article/53875334.html

ただし「従来のオプションも使えるようになっている」とのことなので
特に心配するしたり、急いでオプションを書き換えたりする必要はないと思います。

以下は「mixed_refs」「mbtree」「fast pskip」「8x8DCT」をONにする従来の設定
-flags2 +mixed_refs+mbtree+fastpskip+dct8x8

変わった後の設定
-mixed_refs 1 -mbtree 1 -fast-pskip 1 -8x8dct 1

OFFにするには、数字を「1」から「0」に変更するか、今まで通りオプションそのものを削除すればOK。

以下は「partitions」の従来の設定
-partitions +parti4x4+partp8x8+partp4x41

変わった後の設定
-partitions pi4x4,pp8x8,pp4x4

他にも今までは「-flags2 +wpred」だったのが「-weightb 1」指定可能になっていたり
-deblockalpha 0 -deblockbeta 0」でloopフィルタの強度を指定していたのが
-deblock 0:0」のような書式でも可能になったりと
よりx264のオプション指定に近い形に変更が加えられているみたい。

関連記事

ffmpeg rev.29958 から rev.31700以降 入れ替えでつまずく

今回も携帯動画変換君&ffmpeg ネタ

今日、ffmpeg を新しくしようとしたんだけど、エラーはかれた。
またかよw少し前にも同じ様な事あって記事に書いてる

事の発端は、ffmpeg rev.29958 において -i_qfactor 1.40 って指定しているにもかかわらず
なぜか無視されて、ffmpegデフォルト値の 0.71 になってしまう現象。

もしかすると、これはバグなのかな?と思い
もしバグなのであれば、少し上のリビジョンで修正されてるんじゃないか
って事で rev.29958 から rev.31700 に新しくした訳です。

が、しかしあの Error 1 が…。(エラー1はオプション指定が誤った際に出るって事はお馴染み)
とりあえず、エラーメッセージを見てみる。

…あれ?エラーメッセージが表示されてない…

オプションを変えたりして
色々試してみたけど rev.31700 では結局エラー
rev.29958 に戻すと問題なし

打つ手がなく無くなってしまった、というよりエラーメッセージが表示されないんだから、手がかりすらない。

とりあえず問題解決するため rev.35051 をダウンロードして
これで試してみる
(あ、因みに rev.35051では -wpredp オプションが -weightp オプションに変わってる)

またもやエラーだったが、今回はちゃんとエラーメッセージが表示されていた

timestamp is deprecated, set the 'creation_time' metadata tag instead.
No '=' character in metadata string .
A>Dialog : 処理実行中にエラーが発生しました [Error:1]
T>Finished.

timestamp は非推奨だから、代わりに「creation_time」っていうメタデータタグを使え!
ってことらしい。

面倒くさいので、手っ取り早く -timestamp “<%TimeStamp%>” を削除。

無事、めでたく動きました…。
因みに、冒頭の -i_qfactor 指定が無視される現象も解決。
やっぱバグだったのかな?。

冗長気味な文章で書いてきたので簡単にまとめ

rev.29958 から rev.31700 にしたら Error 1 を吐く(エラーメッセージ表示されず…)
仕方がないので rev.35051 で試してみる
またもやエラーだったが、今度はちゃんとエラーメッセージ表示される。
-timestamp "<%TimeStamp%>" を削除、もしくは
-metadata creation_time="<%TimeStamp%>" に書き換え

で解決。こういう問題は、解決するまで時間が掛かるし(と言っても数十分程度)、疲れる orz

後で調べたら、この事が以下のコメント欄でやり取りされてた…しかも2か月前に。/(^o^)\ナンテコッタイ
FFmpeg rev.32736 ダウンロード お気に入りの動画を携帯で見よう

その他の関連記事

携帯動画変換君PSP用設定(新しいffmpeg用)

前回に引き続き、携帯動画変換君&FFmpegネタ。

前回の記事のPSP設定を MP4Box.exe 無しでも動作するように改良。

新しい ffmpeg と neroAacEnc.exe を 変換君の cores フォルダに入れて
以下の設定を Transcoding.ini の末尾に追加すれば、すぐ変換できるようになるはず。

※ Item番号は、各自 Item1, Item2 と順番通りになるように修正して下さい。

[Item41]
Title=PSP Setting [Main Profile Level 2.1] new
Command0=""<%AppPath%>\cores\ffmpeg" -threads 1 -y -i "<%InputFile%>" -timestamp "<%TimeStamp%>" -flags2 +fastpskip -vcodec libx264 -coder 1 -bufsize 4096k -partitions +parti4x4+partp8x8 -subq 7 -g 300 -aspect 16:9 -s 480x272 -r 30000/1001 -qmin 10 -qmax 51 -qdiff 6 -i_qfactor 1.40 -qcomp 0.7 -crf 20 -an -f mp4 -level 21 "<%TemporaryFile%>.mp4""
Command1=""<%AppPath%>\cores\ffmpeg" -y -i "<%InputFile%>" -vn -acodec pcm_s16le -ac 2 -ar 48000 -vol 256 -f wav "<%TemporaryFile%>.wav""
Command2=""<%AppPath%>\cores\neroAacEnc" -q 0.4 -lc -if "<%TemporaryFile%>.wav" -of "<%TemporaryFile%>.m4a""
Command3=""<%AppPath%>\cores\ffmpeg" -y -i "<%TemporaryFile%>.mp4" -vcodec copy -i "<%TemporaryFile%>.m4a" -acodec copy -f mp4 "<%OutputFile%>.mp4""
Command4=""<%AppPath%>\cores\ffmpeg" -y -i "<%InputFile%>" -f image2 -ss 5 -vframes 1 -s 160x120 -an "<%OutputFile%>.jpg""
Command5="cmd /c "del "<%TemporaryFile%>*.*"""

もっと高画質にしたい!

画質を変化させたい人は command0 にある -crf 20 を書き換える。

値を小さくすればするほど、画質が向上 (ただし、ファイルサイズも増える)
逆に大きくすれば、画質が低下 (ただし、ファイルサイズも減る)

因みにあんまり値を小さくし過ぎても、無駄にファイルサイズを喰うだけなので
15 程度に抑えておくのが個人的にオススメ。個人的には 20 でも充分綺麗だと思う。

もっと高音質にしたい!

音質を変化させたい人は、Command2 にある -q 0.4 の値を変化

0.55 とか 0.6 とか値を上げれば、音質向上 (ただし、ファイルサイズも増える)
逆に 0.3 とか下げれば、音質低下 (ただし、ファイルサイズも減る)

Command2=""<%AppPath%>\cores\neroAacEnc" -br 128000 -2pass -lc -if "<%TemporaryFile%>.wav" -of "<%TemporaryFile%>.m4a""

音声部分は neroAacEnc.exe を使って変換しているので
もっと詳しいオプションは、neroAacEnc関連記事を参照。

動画の縦横のサイズ変更がしたい!

例えば、縦320、横240 にする場合
-s 480×272 を -s 320×240 とすればサイズ変更できる。

因みに、アスペクト比を変更するには -aspect を書き換える。
16:9にする場合
-aspect 16:9

4:3 にする場合
-aspect 4:3

もっと変換速度を高速にしたい!

マルチスレッドに対応しているCPUであれば -threads 1 を -threads auto に書き換える。
こうする事で、CPUの処理能力を全て動画変換処理に集中するので、処理速度が向上する。
(当たり前だけど、変換中はCPUが常に100%になる)

CPUがシングルコア、シングルスレッドでも指定しちゃだめではないが、あまり効果がない。

動画のフレームレート (FPS) を変更したい!

動画のフレームレートを変更する場合 -r オプションを書き換える。
ここでは、分数指定で紹介。

30 fps 指定
-r 30

29.970… fps 指定
-r 30000/1001

23.976… fps 指定
-r 24000/1001

もっとオプションを弄って細かく設定したい!

ffmpeg には、ここでは紹介しきれない程のオプションが存在します。
Google などで色々とオプションを調べてみるいいかも。

以上、少し疲れた…(^∇^;)
長い記事を書くの慣れていないと大変だなぁ…。

PSP用の 2pass 設定は、また後日。

その他の関連記事