2009年05月16日

FFmpeg最新版とneroAacEncで3GP動画変換

FFmpegでAACのエンコードができなくなって、生きる気力をなくしている皆様、いかがお過ごしでしょうか。

そんな皆様に元気になっていただこうと思い、携帯動画変換君で、Nero AAC コーデックを使って3GP動画を作成してみました。

1. Nero AAC コーデックの入手

Nero AAC コーデックは、以下の場所にあります。
http://www.nero.com/jpn/technologies-aac-codec.html

【ダウンロード】ボタンをクリックするとダウンロードのページに移動しますので、移動先の下の方にある【同意する】ボタンをクリックします。
メールアドレスの入力が必要です。

NeroDigitalAudio.zipを、適当な場所に保存します。
ファイルを解凍すると、

linux
win32

という2つのフォルダができますので、win32の中にあるファイル3つ

neroAacDec.exe
neroAacEnc.exe
neroAacTag.exe

を、携帯動画変換君のcoresフォルダにコピーします。

通常は、以下のようになっていると思います。
C:\Program Files\3GP_Converter\cores\

とりあえず今回は、neroAacEnc.exeのみ使用します。


2. 携帯動画変換君の設定

Transcoding.iniに、以下の設定を追加します。
あとは、携帯動画変換君に変換元の動画をドラッグ&ドロップで出来上がるのを待ちます。

Title=【動画】QVGA 30fpsステレオ FFmpeg最新版 + Nero AAC コーデック
Command0=""<%AppPath%>\cores\ffmpeg" -y -i "<%InputFile%>" -vn -acodec pcm_s16le -ac 2 -ar 44100 "<%TemporaryFile%>.wav""
Command1=""<%AppPath%>\cores\neroAacEnc" -if "<%TemporaryFile%>.wav" -lc -br 128000 -of "<%TemporaryFile%>.aac"
Command2=""<%AppPath%>\cores\ffmpeg" -y -i "<%TemporaryFile%>.aac" -i "<%InputFile%>" -acodec copy -vcodec libxvid -flags +bitexact+mv4 -s 320x240 -aspect 4:3 -r 29.97 -b 500k -f 3gp -threads 3 "<%OutputFile%>.3gp""
Command3="rm "<%TemporaryFile%>.wav""
Command4="rm "<%TemporaryFile%>.aac""

2011/07/05 追記
DVDのVOBファイルから、neroAacEncとlibx264またはlibxvidcoreの組み合わせでエンコードした場合に、以下のようなエラーが出る場合があります。

Stream mapping:
Stream #1.0 -> #0.0
Stream #1.1 -> #0.1
Could not write header for output file #0 (incorrect codec parameters ?)

この場合は、FFmpegのオプションで、音声と映像を結合する時(Command2)の行に、
-map 1.0 -map 0.0
を追加してみてください。

201/09/21 追記
当サイトのFFmpeg rev.32736より、上記の場合でも-mapオプションを付けなくてもエラーが出なくなりました。
特に指定したい場合は、-mapオプションの書式が変わっていますので、
-map 1:v -map 0:a
を追加してみてください。

その他、FFmpeg rev.32736より、「-acodec copy」を「-i "<%InputFile%>"」の後ろに置かないとエラーになるため、修正しました。


Titleやビットレートなどは、お好みで変更してください。

neroAacEncのパラメータは、neroAacEnc同封のreadme.txtを参照してください。

neroAacEncはWAVしか受け付けないので、最初に音だけWAVにして抜き出し、最後に映像のエンコード時に結合しています。

AACは3種類あります。
-lc : AAC-LC (通常はコレ)
-he : HE-AAC
-hev2 : HE-AACv2

ちなみに、ドコモP905iは、上記3種類のAACとxvidの組み合わせの動画どれでも再生できました。

出来上がった動画のサイズは、LC AACとHE-AACがほぼ同じ(HE-AACの方が少し小さい)、HE-AACv2が一番小さくなりました。

長さ5分くらいの動画でしか試していませんので、もしかして音ズレなど生じるかもしれませんが、特に問題はなさそうです。

とりあえず今日はここまで。


2010/01/11 追記
通常のオプションに、1パス目は「-pass 1」、2パス目は「-pass 2」を追加してエンコードを繰り返すだけで、2パスエンコードすることも可能です。
-passlogfileオプションは任意です。

Command0=""<%AppPath%>\cores\ffmpeg" -y -i "<%InputFile%>" -vn -acodec pcm_s16le -ac 2 -ar 44100 "<%TemporaryFile%>.wav""
Command1=""<%AppPath%>\cores\neroAacEnc" -if "<%TemporaryFile%>.wav" -lc -br 128000 -of "<%TemporaryFile%>.aac"
Command2=""<%AppPath%>\cores\ffmpeg" -y -i "<%TemporaryFile%>.aac" -i "<%InputFile%>" -acodec copy -pass 1 -passlogfile "xvid_2pass" -vcodec libxvid -flags +bitexact+mv4 -s 320x240 -aspect 4:3 -r 29.97 -b 500k -f 3gp -threads 3 "<%OutputFile%>.3gp""
Command3=""<%AppPath%>\cores\ffmpeg" -y -i "<%TemporaryFile%>.aac" -i "<%InputFile%>" -acodec copy -pass 2 -passlogfile "xvid_2pass" -vcodec libxvid -flags +bitexact+mv4 -s 320x240 -aspect 4:3 -r 29.97 -b 500k -f 3gp -threads 3 "<%OutputFile%>.3gp""
Command4="rm "<%TemporaryFile%>.wav""
Command5="rm "<%TemporaryFile%>.aac""


音声無しで映像だけ2パスエンコードして、最後に音声と映像を結合する場合は少し工夫が必要で、以下のようになります。
出力される動画は上記の設定と同じです。

Command0=""<%AppPath%>\cores\ffmpeg" -y -i "<%InputFile%>" -vn -acodec pcm_s16le -ac 2 -ar 44100 "<%TemporaryFile%>.wav""
Command1=""<%AppPath%>\cores\neroAacEnc" -if "<%TemporaryFile%>.wav" -lc -br 128000 -of "<%TemporaryFile%>.aac"
Command2=""<%AppPath%>\cores\ffmpeg" -y -i "<%InputFile%>" -pass 1 -passlogfile "xvid_2pass" -an -vcodec libxvid -flags +bitexact+mv4 -s 320x240 -aspect 4:3 -r 29.97 -b 500k -f 3gp -threads 3 "<%TemporaryFile%>.3gp""
Command3=""<%AppPath%>\cores\ffmpeg" -y -i "<%InputFile%>" -pass 2 -passlogfile "xvid_2pass" -an -vcodec libxvid -flags +bitexact+mv4 -s 320x240 -aspect 4:3 -r 29.97 -b 500k -f 3gp -threads 3 "<%TemporaryFile%>.3gp""
Command4=""<%AppPath%>\cores\ffmpeg" -y -i "<%TemporaryFile%>.aac" -i "<%TemporaryFile%>.3gp" -acodec copy -vcodec copy -f 3gp "<%OutputFile%>.3gp""
Command5="rm "<%TemporaryFile%>.wav""
Command6="rm "<%TemporaryFile%>.aac""
Command7="rm "<%TemporaryFile%>.3gp""


2010/06/24 追記
-flags +bitexact+mv4 について補足です。
「4mv」と書いてあるのを今でも時々見かけますが、正しくは「mv4」です。
posted by あべちん at 21:57 | Comment(36) | TrackBack(2) | 携帯動画変換君
この記事へのコメント
あべちんさん、ありがとうございます。
実は僕の携帯もP905iですので、このiniそのまま使わせてもらいます。

PSP用の分も作ってみます。
Posted by nanashi at 2009年05月17日 10:38
できないしww
Posted by at 2009年12月28日 10:02
名無しさん、こんにちは。管理人です。

よろしければ、何ができないのかご説明いただけませんでしょうか。

返信が無いようでしたら、しばらくしたらこのコメントは削除いたします。
Posted by あべちん at 2009年12月29日 03:17
2パスエンコードすることは可能でしょうか?
もし可能でしたら、設定を教えてください。
Posted by at 2010年01月11日 00:43
名無しさん!元気ですかー!
1、2、3、ダーッ!!

記事の方に追記しましたので、お試しください。
Posted by あべちん at 2010年01月11日 18:53
できました。ありがとうございました。
Posted by at 2010年01月11日 23:09
音声のみNeroでエンコードする場合ですが、自分は今まで変換君のWikiを参考に、MP4Boxというものを使って結合していました。
コマンドラインの例は
Command4=""<%AppPath%>\cores\MP4Box" -add "<%TemporaryFile%>_v.mp4" -add "<%TemporaryFile%>_a.mp4" -new "<%OutputFile%>.mp4""
です。

あべちんさんのやり方とこれとでは、どう違うのでしょうか?
出力される動画に違いは出来ますか?

余計なコンポーネントを入れるのはなるべく避けたいので、あべちんさんのやり方に移行しようかと思っているのですが…
Posted by Mino at 2010年01月25日 05:51
Minoさん、こんにちは。管理人です。

申し訳ないのですが、MP4Boxは使用していないため、違いは分かりません。

私の場合は、FFmpegだけで間に合っており、特に不都合なこともありません。

Minoさんの環境で、Command4だけ変えて、2種類の動画を出力して比べて見るのが一番良いのではないかと思いますが、いかがでしょうか?
Posted by あべちん at 2010年01月28日 08:26
すいません、確かにおっしゃる通りです ^^;
まず自分で試すべきでした…

試した結果、何ら問題はないようなので、このやり方を使わせて頂こうと思います。
Posted by Mino at 2010年01月28日 16:46
管理人さん 皆さん こんばんは!

Minoさん

参考に!

http://cuteynyanko.blog117.fc2.com/blog-entry-32.html

Posted by まさみ at 2010年01月29日 22:16
まさみさん、こんにちは。管理人です。

詳しい説明ありがとうございます。
とても参考になりました。

MP4Boxを使うと微妙に違うんですね。
映像が同じなら問題なさそうです。

ありがとうございました。
Posted by あべちん at 2010年02月04日 14:17
4Videosoft 3GP 変換パックはDVDとビデオを3gpに変換できます:
http://www.4videosoft.jp/dvd-to-3gp-suite.html
Posted by 名無し at 2010年10月28日 17:01
名無しさん、こんにちは。管理人です。
宣伝おつかれさまです。

これは試用できるのでしょうか?
こわくてインストールできません。
Posted by あべちん at 2010年10月28日 19:55
Bros 動画変換は高画質かつ便利な動画変換ソフトとして、ASF、AVI、
MOV、MP4、WMV、FLV、MPGなどの動画形式の間に相互変換できます。また、MP3、MP2、WMA、WAV、M4A、AAC、AC3、FLAC、AU、AMR、AIFFなどの音声形式の間にも変換できます。
動画から人気音楽を抽出する
Bros 動画変換は高速の変換機能が備えていますから大変助けます。AVI、ASF、MP4、MOV、FLV、DivX、Xvid、MPEG1、MPEG2などの動画形式からMP3、MP2、AC3、WMA、WAV、M4A、FLACなどの音声形式を抽出することも実現できるようになります。
Posted by xiangxiang at 2011年01月23日 14:52
最近機種交換して au K006 にしたのですがNeroAacEncはダメでした。
現在は FAAC 1.28 でエンコードして QuickTime で断片化しています。
K006偽装を行うと2時間の音声データでも、着信音に設定可能になります。
Posted by UTNO at 2011年05月25日 22:55
UTNOさん、こんにちは。管理人です。

情報ありがとうございます。
NeroAacEncだとなぜダメなんでしょう?
謎ですね。

2時間も着信音が鳴り続けることはまず無いと思いますが、そういうことを追求するのは私も大好きです!

NeroAacEncでも、こうしたら上手くいったなど、また何か分かりましたらご報告をお待ちしております。
Posted by あべちん at 2011年05月27日 22:55
NeroAacEncで作成したファイルをK006で再生する方法が分かりました。
MP4Boxを使ってRawストリームを抽出しQuickTimeで断片化すると再生可になります。

NeroAacEnc.exe -lc -q 1.0 -if Audio.wav -of Audio.m4a
MP4Box.exe Audio.m4a -raw 1

上記のコマンドで Audio_track1.aac が抽出されます。
これをQuickTimePlayerで開きエクスポートします。
・フォーマット  3GPP2
・ビデオ     なし
・オーディオ   そのまま
・テキスト    なし
・ストリーミング 使用しない
・詳細      断片化する 最初の断片15秒 次の断片15秒

偽装無しの場合は5Mバイトまでですが偽装すると2時間まではOKです。
3時間以上は再生テストをしていないので分かりません。
MIDIで作成したバッハ平均律クラヴィーア曲集の再生時間は4:55:43ですが、K006は3:00:00と認識します。
同じくMIDIで作成したラモーのクラヴサン曲集は2:34:34ですが最後まで再生できました。

考えられる原因としてNeroAacEncの出力にK006で使用できないタグ(Atom)が含まれていると思われます。

QT3GPPFlatten.exeを使って変換する方法は試行錯誤中です。

K006では音声のみデータの連続再生(オートプレイ)はできないので長時間データが必要になります。
また、ダミー画像を付けてムービーにすると連続再生が可能になりますが、携帯を閉じると停止します。

K006はサンプリング周波数が24Kまでなので作成時は注意して下さい。

今回は音声のみですがビデオデータも調査中です。
「携帯動画変換君」付属のffmpegでは問題なく変換でき、偽装すれば映画1本分でも可能です。
このサイトでビルドしているffmpegではまだうまくいきません。
以前 A5523T 用に xvid_encraw で作成した動画も再生できません。
Posted by UTNO at 2011年05月28日 12:37
UTNOさん、こんにちは。管理人です。

詳しい情報ありがとうございます。

最近のffmpegではダメなのですね。
携帯動画変換君に付属のffmpegと比べても、いろいろ変更があって、もう何が違うのか分かりません。

また何か発見などありましたら、ご報告をお待ちしております。
Posted by あべちん at 2011年05月31日 20:43
いろいろ試してみましたが、ビデオデータはまだうまくいきません。
1つ分かった事は「携帯動画変換君」付属のffmpegであっても -muxvb および -muxab オプションが必要です。
これを外すと再生不可になります。このオプションは「携帯動画変換君」付属のffmpeg独自のものだったと思います。


話は変わりますがNeroAacを使った変換時に中間WAVファイルを作成しているようですがパイプを使ってffmpegからNeroAacEncへ直接渡せばWAVファイルを作成する必要はありません。
ただし、私が試した範囲では「携帯動画変換君」はパイプに対応していません。
「携帯動画変換君」ではなくバッチファイルで処理する方法を書いておきます。

ffmpeg -i "%~f1" -vn -acodec pcm_s16le -ac 2 -ar 44100 -f wav - | neroAacEnc -ignorelength -if - -lc -br 128000 -of "%~f1_tmp.aac"
ffmpeg -y -i "%~f1_tmp.aac" -acodec copy -i "%~f1" -vcodec libxvid -flags +bitexact+mv4 -s 320x240 -aspect 4:3 -r 29.97 -b 500k -f 3gp -threads 3 "%~dp1%~n1_Out.3gp"
Del "%~f1_tmp.aac"

上記の例では1回のD&Dで1個のファイルしか処理しませんが変数部分を工夫すれば複数ファイルの処理も可能です。
WAVファイルの場合44.1kHzで3時間23分以上(5.1chの場合は1時間8分以上)のときは2GBを超えて処理出来ない事がありますが、パイプを使えば問題ありません。
ffmpegおよびNeroAacEncはパスが通っているか、フルパスで指定する必要があります。
パイプを使用した場合、音声の2パスエンコードは出来ません。(NeroAacEncの-2passオプションは使用不可)
私はNeroAacEncの前にsoxを入れてコンプレッサをかけています。
マルチメディアツールではファイル名に - を指定すると標準入出力になるものが多いようです。
Posted by UTNO at 2011年06月05日 13:34
UTNOさん、こんにちは。管理人です。

またまた詳しい情報ありがとうございます。

-muxvbと-muxabが原因だとすると、対応は難しいですね。

あと、私も「携帯動画変換君」でパイプを試してみましたが、使用できませんでした。
バッチファイルのショートカットを作っておけば良いかもしれませんね。

ありがとうございました。
Posted by あべちん at 2011年06月07日 01:51
今までは最新版で試していたのですが、faacが入ったffmpegでは問題無く再生できました。
ただし、音声ビットレートを64K以上で指定すると再生できません。
-ab 64000を指定して-cutoffを設定(サンプリング周波数の半分)すると実際のビットレートが64Kを超えても問題ありませんでした。
(cutoff指定時には-ab 64000を指定しても24kHzで70〜90kbps程度になります。)
こちらのサイトからダウンロードしたR12629〜R18607で確認しました。
ストリーム形式やビットレートの渡し方(ヘッダ部)等が原因ではないかと思います。

R12629〜R18607でNeroAacを使った場合は再生できませんでした。
MP4コンテナのままffmpegの入力にすると出力側は
Stream #0.1(und): Audio: libfaac, 24000 Hz, stereo, s16
となり、ビットレートが書き込まれないようです。
また、aacストリームを抽出してffmpegの入力にすると
Stream #0.1: Audio: libfaac, 24000 Hz, stereo, s16, 63 kb/s
となってビットレートは入りますがQuickTimeで読み込み不可になり、断片化ができません。
MPCでも再生不可でした。(ffplayとVLCでは再生可能でした。)
Posted by UTNO at 2011年06月16日 18:05
さらに、いろいろと試していると、問題点が映像なのか音声なのか分からなくなってきます。
切り分けのために映像のみをエンコードしてみるとR29060まではOKですがR29196からは再生不可になります。

R29060を使ってNeroAacを試してみると...
MP4コンテナのままffmpegの入力にすると携帯側で再生不可になります。
MP4Boxで抽出したaacストリームをffmpegの入力にするとQuickTimeで読み込み不可になります。
抽出したaacストリームをffmpegの入力にして -absf aac_adtstoasc を指定すると問題無く再生できました。
この場合も64Kを超えると再生不可になりますのでNeroAacで-cbr 62000を指定します。
(-cbr 64000を指定するとffmpegで65Kと認識しますので-cbr 62000にします。)
品質指定の場合ffmpegで3kbpsと認識されます。
(実際には24kHz -q=1.0 で200kbps程度ですが再生可能です。)

そこで原因がCodecなのかMuxerなのかを調べるためVirtualDubで作成した映像とNeroAacで作成した音声をffmpegでMuxしてみました。
ffmpeg -i Input.avi -i Input.aac -absf aac_adtstoasc -vcodec copy -acodec copy -f 3gp Output.3gp
結果は映像のみの時と同じでR29060までは再生可能でR29196以降は再生不可になりました。
映像は Xvid 1.3.2 SimpleProfile @ Level 3 , 音声は NeroAacEnc 1.5.4.0 -q=0.5 です。
Posted by UTNO at 2011年06月17日 19:26
昨日の内容に一部誤りがありました。
品質指定の場合3kbpsと認識されると書きましたが間違いでした。
また、--cbr 62000で問題無いという点も間違いです。

今までテスト用に使っていた内容は全て先頭に無音部分がありました。
先頭から音が入っているものを試してみるとffmpegが認識するビットレートは内容により変化するようです。
おそらく先頭から一定時間(数秒?)のビットレートを認識しているようです。

音声の内容によってはNeroAacで--cbr 48000を指定してもffmpegで80kbps以上と認識されることがあります。
先頭に1〜2秒の無音部分を付加することで回避できるようです。
Posted by UTNO at 2011年06月19日 01:38
UTNOさん、こんにちは。管理人です。

詳しい情報ありがとうございます。

携帯動画変換君に同封されているffmpegのように、-muxavと-muxvbで偽装できるようにすれば良いのかもしれませんね。

携帯動画変換君に同封されているffmpegと現在のでは、ソースコードがだいぶ変わってしまっているので、できるかどうかわかりませんけど。
Posted by あべちん at 2011年06月20日 19:06
Zeranoeビルドのffmpegで試してみると映像のみの場合R29151まではOKでR29157からは再生不可でした。
ソースファイルをダウンロードして違いを確認しています。

一番あやしいのはlibavformat\movenc.cのmov_write_esds_tag()とmov_write_uuidprof_tag()です。

movmov_write_esds_tag()の37行目付近(movenc.cの314行目付近)にビットレート設定がありR29157で変更されています。

mov_write_uuidprof_tag()の33行目付近(movenc.cの1948行目付近)に-muxabに相当する箇所があるようです。

mov_write_uuidprof_tag()の50行目付近(movenc.cの1967行目付近)に-muxvbに相当する箇所があるようです。


こちらのサイトの記事を参考にしてMinGWを導入しました。
ライブラリのコンパイルまでは問題なかったのですが
ffmpegのconfigure時にWindowsのテンポラリディレクトリに作成されるffconf.XXXXXXXX.exeがAvast!でトロイの木馬だと検出されてしまいます。
(XXXXXXXXはハッシュのようで毎回変化します。ウイルス名はWin32:Oficla-BDとなっています)
Avast!の誤検出かもしれませんが、しばらく保留にして様子をみることにします。
ffmpeg-HEAD-1af1b52およびffmpeg-0.8のどちらも同じでAvast!で削除されます。

xvid_encrawでエンコードすると前の東芝では問題なかったのですがK006では画面が真っ黒になります。
Profileが原因でK006ではSP@L3までしか再生できません。(xvid_encrawはASP@L5固定です)
xvidcore.dllのパッチ版を作ってSP@L3固定にすると再生可能になりました。
Posted by UTNO at 2011年06月24日 02:24
作業用PCを組み立ててOSインストールからMinGW環境作成まで行った後LANケーブルを外してウイルスチェックをOFFにしてコンパイルしてみました。
結果はmov_write_esds_tag()のビットレート設定を変更することでK006で問題無く再生できるデータが作成できました。
(R29157以降の問題点もここのようです)
完成したEXEファイルはウイルスとして検出されませんのでAvast!の誤認識の可能性が高いようです。

ffmpeg-HEAD-f925b24 libavformat/movenc.cの314行目付近
// avio_wb32(pb, FFMAX3(track->enc->bit_rate, track->enc->rc_max_rate, avg_bitrate));
// avio_wb32(pb, avg_bitrate);
if(track->enc->codec_type == AVMEDIA_TYPE_AUDIO) {
avio_wb32(pb, 64000); // audio 64k
avio_wb32(pb, 64000);
}
else {
avio_wb32(pb, 96000); // video 96k
avio_wb32(pb, 96000);
}

コメント行にしている部分が元のソースです。
この修正を行った場合、この内容の前にある
avg_bitrate = compute_avg_bitrate(track);
の行は削除して問題無いと思います。
また関数内の変数 avg_bitrate と関数 compute_avg_bitrate() も削除可と思います。


xvid Q=1.0 NeroAAC Q=1.0 で作成すると映像1.6Mbps 音声210kbpsの再生可能なデータが出来ました。
さすがに映像はカクカクになりましたが音声は正常に再生されました。(映像も1Mbps程度までは正常に再生できます)

このビットレート制限はK005でも全く同じでした。
他のKシリーズも同じかもしれません。
Posted by UTNO at 2011年06月25日 01:05
UTNOさん、こんにちは。管理人です。

またまた詳しい情報ありがとうございます。

配布用のffmpegで、ビットレートを直接書くのが良いかどうかわかりませんので、オプションで該当箇所を変えられるようにできれば良さそうですね。

あと、私もavast!を入れていますが、同じように誤検出します。

試しに、誤検出した時とavast!を無効にした時を比べてみたら、config.makなどの違いがなかったので、面倒なので今はそのままにしています。
Posted by あべちん at 2011年06月27日 05:50
オプションスイッチで対応ということですが修正量が多くなり大変だと思いますが...
たしかにオプション指定がベストだと思いますが必要な人がパッチをあててコンパイルするという対応程度で良いのではないでしょうか?
このサイトではコンパイル時の問題点を分かりやすく解説してあるので問題ないと思います。


ライブラリをいくつか追加して ffplay をコンパイルしてみましたがコンソール画面が表示されなくなりました。
ffplay だけでなく ffmpeg も表示されなくなり、進捗状況がわからなくなりましたが、これはこれで便利な点もあります。
コマンドプロンプトは次の入力が可能なので ffmpeg で処理中に他の音声のエンコードが出来ます。
SDL, FreeType, gavl, libpng, libtiff, Schroedinger, OpenJpeg 等を追加しましたが
SDLの設定があやしいですね。原因は調査中です、分かり次第また書き込みます。


Libav もコンパイルしてみましたが、ほとんど ffmpeg と違いはありません。(内容によりますが Libav が少し古いように感じます)
分離した詳細は知りませんが開発者は一部重複しているようですね。
Posted by UTNO at 2011年06月29日 19:36
UTNOさん、こんにちは。管理人です。

いろいろとありがとうございます。
オプション追加の件は、どうするのが良いかもう少し考えます。

パッチを置いておくにしても、分からない人にも何のパッチか説明しないといけないので、それはそれでけっこう大変です。

Libavについては、FFmpegのロゴまでLibavから文句を言われたようで、微妙に変えたりしてますね。
Libavの変更は、FFmpeg本家にもマージされているようです。
Posted by あべちん at 2011年06月30日 07:45
○パッチについて
私が書き込んだ数行の内容を置いておくだけで、このサイトのサポートは無しと考えていましたが、
管理人さんはパッチとサポートまで考えていらっしゃるのですね。
このサイトに書き込んだ時点で管理人さんに任せたわけですから、これ以上この話題には触れないことにします。

○SDLについて
SDL の Windows版では SDL内に WinMain()があり、コンソールアプリではなく、ウインドウアプリになるようです。
コンソール画面を表示させる対応は手間とそれにたいして得られる結果を考えてあきらめることにしました。
ffplayのみSDL有りでffmpegとffprobeはSDL無しにするようにしました。
configureのオプションではSDLを切り離せなかったのでffplayコンパイル時にSDLをインストール、終了時にアンインストールしています。




一通り動画関連(GPAC,sox,ffms2,alac等)のコンパイルが済んだので K006/K005 用の設定を書き込んでおきます。
ffmpeg内蔵のaacエンコーダではK006で再生不可になります。mp4コンテナをffmpegの入力にした時と同じ現象だと思われます。
ffmpegはビットレート設定パッチが入ったものを使って下さい。
soxは14.3.2で試しましたが少し古いものでも問題無いと思います。
MP4Boxはaacストリーム抽出ができれば古いものでも問題無いと思います。

Command0=""<%AppPath%>\cores\ffmpeg" -i "<%InputFile%>" -vn -acodec pcm_s16le -ar 24000 "<%TemporaryFile%>.wav""
Command1=""<%AppPath%>\cores\sox" "<%TemporaryFile%>.wav" "<%TemporaryFile%>_R.wav" norm compand .01,.05 -20,-10,-0,-6 norm"
Command2="rm "<%TemporaryFile%>.wav""
Command3=""<%AppPath%>\cores\neroAacEnc" -lc -q 0.5 -if "<%TemporaryFile%>_R.wav" -of "<%TemporaryFile%>.m4a""
Command4="rm "<%TemporaryFile%>_R.wav""
Command5=""<%AppPath%>\cores\mp4box" "<%TemporaryFile%>.m4a" -raw 1"
Command6="rm "<%TemporaryFile%>.m4a""
Command7=""<%AppPath%>\cores\ffmpeg" -y -i "<%TemporaryFile%>_track1.aac" -absf aac_adtstoasc -acodec copy -i "<%InputFile%>" -flags +bitexact -vcodec libxvid -qscale 4.0 -s 320x240 -r 15.0 -f 3gp "<%TemporaryFile%>.3gp""
Command8="rm "<%TemporaryFile%>_track1.aac""
Command9=""<%AppPath%>\cores\QT3GPPFlatten" "<%TemporaryFile%>.3gp" "<%TemporaryFile%>.3g2" -c QT_3GPP2_QVGA_AAC.ini"
Command10="rm "<%TemporaryFile%>.3gp""
Command11=""<%AppPath%>\cores\ATOMChanger" "<%TemporaryFile%>.3g2" "<%OutputFile%>.3g2" "Camouflage_MOVIE_for_K006.ini""
Command12="rm "<%TemporaryFile%>.3g2""

QTMLClient.dll はQuickTimeのQTSystemフォルダからコピーして下さい。
QT_3GPP2_QVGA_AAC.ini は一度削除して作成し直すことをお勧めします。
音声のコンプレスが不要な場合は Command1 の行は削除して下さい。
Command1 の compand パラメータは好みにより変更して下さい。(効果を弱くする場合は-20を-12〜-15くらいにしてみて下さい)
Command7 の flags の内容はお好みにより追加してください。(+mv4+mv0++aic+loop+part等)
Camouflage_MOVIE_for_K006.ini の内容は以下の通りです。

[Config]
Title=K006本体で撮影したムービーに偽装します。
UUID=%A8%8C%11%D4%81%97%00%90%27%08%77%03
[DeleteAtom]
Item0=ftyp
Item1=free
Item2=edts
Item3=uuid
[InsertAtom]
Item0=ftypkddi%00%00%00%00kddi3g2a3gp53gp4
Item1=uuidmvml<%UUID%>%00%00%00%00%FF%FF%E0%00<%TIMESTAMP%>
Item2=uuidenci<%UUID%>%00%00%00%00KDDI-KC%00K006%00%00%00%00KCF000E0KCF000M0
Item3=uuidcpgd<%UUID%>%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00




音声のみの場合

Command0=""<%AppPath%>\cores\ffmpeg" -i "<%InputFile%>" -vn -acodec pcm_s16le -ar 24000 "<%TemporaryFile%>.wav""
Command1=""<%AppPath%>\cores\neroaacenc" -lc -q 0.5 -if "<%TemporaryFile%>.wav" -of "<%TemporaryFile%>.m4a""
Command2="rm "<%TemporaryFile%>.wav""
Command3=""<%AppPath%>\cores\mp4box" "<%TemporaryFile%>.m4a" -raw 1"
Command4="rm "<%TemporaryFile%>.m4a""
Command5=""<%AppPath%>\cores\ffmpeg_31072Mod" -y -f image2 -loop_input -shortest -i "<%AppPath%>\cores\DummyQVGA.jpg" -i "<%TemporaryFile%>_track1.aac" -absf aac_adtstoasc -flags +bitexact -vcodec libxvid -qscale 4.0 -aspect 4:3 -acodec copy -f 3gp "<%TemporaryFile%>.3gp""
Command6="rm "<%TemporaryFile%>_track1.aac""
Command7=""<%AppPath%>\cores\QT3GPPFlatten" "<%TemporaryFile%>.3gp" "<%TemporaryFile%>.3g2" -c QT_3GPP2_AudioOnly.ini"
Command8="rm "<%TemporaryFile%>.3gp""
Command9=""<%AppPath%>\cores\ATOMChanger" "<%TemporaryFile%>.3g2" "<%OutputFile%>.3g2" "Camouflage_VOICE_for_K006.ini""
Command10="rm "<%TemporaryFile%>.3g2""

QT3GPPFlatten は入力側に映像が無いとエラーになりますのでダミー映像を付けています。
DummyQVGA.jpg の映像の内容はどのようなものでも構いません。(速度やサイズで有利なので私は黒単色にしています)
QT_3GPP2_AudioOnly.ini は3GPP2、ビデオ無、オーディオそのまま、配信無し、断片化あり15秒15秒で作成して下さい。
Camouflage_VOICE_for_K006.ini の内容は以下の通りです。

[Config]
Title=K006のボイスレコーダーで録音したファイルに偽装します。
UUID=%A8%8C%11%D4%81%97%00%90%27%08%77%03
[DeleteAtom]
Item0=ftyp
Item1=free
Item2=edts
Item3=uuid
[InsertAtom]
Item0=ftypkddi%00%00%00%00kddi3g2a
Item1=uuidmvml<%UUID%>%00%00%00%00%FF%FF%E0%00<%TIMESTAMP%>
Item2=uuidenci<%UUID%>%00%00%00%00KDDI-KC%00K006%00%00%00%00KCF000E0KCF000M0
Item3=uuidcpgd<%UUID%>%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00




今後しばらくは動画関連ではないものをコンパイルしてみます。
まずは FireFox から試してみます。
Posted by UTNO at 2011年07月07日 00:20
UTNOさん、こんには。管理人です。

いつも情報ありがとうございます。

せっかくの情報が、コメント欄で埋もれてしまうのはもったいないので、独立した記事にしたいところですが、自分で動作確認できないため、責任がもてないんです。

ということで、特定の機種についての記事は、いまだに、自分で使用しているDoCoMoのP905iだけです(´・ω・`)

UNTOさんも、ブログかFacebookか、何かご自分で情報発信できるものを作ってみてはいかがですか?
Posted by あべちん at 2011年07月08日 00:08
ブログ等は苦手なのでモノだけ置いておきます。
http://software.utno.no-ip.org/
なるべくパッチ無しでコンパイルしていますので「携帯動画変換君」のプログレスバーは表示されません。
また、x264用のパッチも入っていませんので問題が発生するかもしれません。
入っているパッチは gsm.h の位置、いきなりクラッシュの対応分、例のビットレート偽装の3つです。


ビットレート偽装したデータ(音声のみ、着信音設定可)も置いておきます。
http://mobile.utno.no-ip.org/
デュフリやダカン等のバロック・ハープシコード曲です。


31420で音声のみの場合の注意点
-loop_input が廃止になりましたので -loop 1 に変更して下さい。
パラメータは 0 または 1 でブール値になっているようです。


下記ページにある「携帯動画変換君対応」を入れると中断可になるようです。
(キー入力を getch から read へ変更)
http://up-cat.net/MinGW%25A1%25DCffmpeg%25288%2529%25B2%25FE%25C2%25A4.html
Posted by UTNO at 2011年07月23日 21:31
UTNOさん、こんにちは。管理人です。

UNTOさんがコメント欄にお書きになっていることをブログの記事にすれば良いだけですので、難しくないと思いますよ。

ここのコメント欄も、長すぎて読むのも大変なことになってますので、いつかはご自分の媒体に移行さることを期待しております。

携帯動画変換君のプログレスバーは、表示がおかしくなるだけでなく、時間のフォーマット変換の演算が毎回入って、微妙にエンコード速度が落ちるので、パッチを当てました。

エンコード速度を気にするなら、
--enable-small
も外せばいいのに?というツッコミはおいといて…。

中断が効かない件は、まさに携帯動画変換君ごと落とすというやり方で、特に困ったことはありませんので、採用しておりません。
Posted by あべちん at 2011年07月25日 14:13
はじめまして、お初にお目にかかります、たぬたぬと申します。よろしくお願いします。

今まで数年前webで拾った変換君用ffmpegで動画の変換ができなくなったため、新しいffmpegでエンコードできるようにしたいと思い、こちらで最新のffmpeg(42754)で変換君のiniを書いてみました。
Neroaacエンコーダを用い、2passで音声結合をしながら動画変換をさせてみました。


[Item12]
Title=[16:9](2pass)384kbps/24fps/ステレオ/96kbps
TitleE=[16:9](2pass)384kbps/24fps/Stereo/96kbps
Command0=""<%AppPath%>\cores\ffmpeg" -y -i "<%InputFile%>" -vn -acodec pcm_s16le -ac 2 -ar 44100 "<%TemporaryFile%>.wav""
Command1=""<%AppPath%>\cores\neroAacEnc" -if "<%TemporaryFile%>.wav" -lc -cbr 128000 -of "<%TemporaryFile%>.aac"
Command2=""<%AppPath%>\cores\ffmpeg" -threads 4 -y -i "<%TemporaryFile%>.aac" -i "<%InputFile%>" -metadata creation_time="<%TimeStamp%>" -acodec copy -map 1:v:0 -map 0:0 -qmin 10 -qmax 51 -qdiff 6 -i_qfactor 1.40 -qcomp 0.7 -passlogfile "2pass-log" -pass 1 -vcodec libx264 -coder 0 -level 13 -bufsize 128k -s 400x300 -r 24000/1001 -b 384k -minrate 96k -maxrate 512k -g 240 -aspect 16:9 -flags mv4+loop+part+naq+alt+bitexact+aic+umv+cbp+qprd -partitions all -mbd rd -subq 7 -an -f 3gp "<%TemporaryFile%>.m4a""
Command3=""<%AppPath%>\cores\ffmpeg" -threads 4 -y -i "<%TemporaryFile%>.aac" -i "<%InputFile%>" -metadata creation_time="<%TimeStamp%>" -acodec copy -map 1:v:0 -map 0:0 -qmin 10 -qmax 51 -qdiff 6 -i_qfactor 1.40 -qcomp 0.7 -passlogfile "2pass-log" -pass 2 -vcodec libx264 -coder 0 -level 13 -bufsize 128k -s 400x300 -r 24000/1001 -b 384k -minrate 96k -maxrate 512k -g 240 -aspect 16:9 -flags mv4+loop+part+naq+alt+bitexact+aic+umv+cbp+qprd -partitions all -mbd rd -subq 7 -an -f 3gp "<%TemporaryFile%>.m4a""
Command4=""<%AppPath%>\cores\ATOMChanger" "<%TemporaryFile%>.m4a" "<%OutputFile%>.MP4" "Camouflage_MP4_for_PSP.ini""
Command5="rm "2pass-log-0.log""
Command6=""<%AppPath%>\cores\ffmpeg" -y -i "<%InputFile%>" -f image2 -ss 5 -vframes 1 -s 160x90 -an "<%OutputFile%>.THM""

これで変換をかけると、Command4のATOMChangerで動画の音声トラックがないと警告が出て異常終了してしまいます。
Logを見ると、audio:0kbで動画変換時に結合されていないようです。。。  こちらのページを参考に-acodec copyを用いているのですがなぜ音声結合ができないのでしょうか・・・?
よろしければご助言をいただければと思います。
長文失礼しました・・・

(MP4boxでの結合も試しましたが、音声は結合できたものの、再生不可ファイルになってしまっています・・・
Posted by たぬたぬ at 2012年08月02日 20:57
すみません、上で長文書いておいて申し訳ないですが、自己解決してしました・・・

試行錯誤の中で書いてた -anオプションを消し忘れていたせいで音声が出力されなかったらしいです。。。

無事変換できたので次は画質向上に取り組みたいと思います。
お騒がせすみませんでしたm(_ _)m
Posted by たぬたぬ at 2012年08月02日 21:25
たぬたぬさん、こんにちは。管理人です。

-mapオプションが間違ってるのか、何だろうと悩んだのですが、たしかによく見たら-anオプションがついてますね。

-anと-acodec両方ある場合は、オプションの順番にかかわらず-anが有効になるようです。
Posted by あべちん at 2012年08月06日 23:59
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/29190052
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック

FFmpegの可能性
Excerpt:  FAACのコードの一部が実はLGPLに準拠してないので、FFmpegに含めることが出来なくなったらしいという話。お気に入りの動画を携帯で見よう こちらのサイトで配布しているFFmpegのバイナリは、..
Weblog: Miki's mental world Blog edition
Tracked: 2009-05-18 23:05

ブログ消滅!?ココログ終了のお知らせ!?
Excerpt: 「現在、ココログにおいて、サービスが正常にご利用できない状態が発生しております。
Weblog: ココログ終了のお知らせ!?
Tracked: 2009-07-01 01:58