内蔵AACのエンコード(出力)は実験段階のため、まだ音質は良くないです。
まともに動作するようになるまでは、Nero AAC コーデックを使用した音声AAC動画の作成方法を、こちらの記事に書きましたので、参考にしてください。
また、x264について、一番多く質問が寄せられるエラーの説明を記事にしましたので、思い当たる方は、ぜひご一読ください。
x264のエンコードでエラー(Error while opening encoder for output stream #0.0)
ffmpeg_bin-23711.zip
ffmpeg_bin_pentium4-23711.zip (Pentium4最適化版)
ffmpeg_bin_core2-23711.zip (Core2最適化版)
ffmpeg_bin_athlon64-23711.zip (Athlon64最適化版)
ffmpeg_bin_phenom-23711.zip (Phenom最適化版)
以下のライブラリをアップデートしました。
libvpx-0.9.1-13
faad2-2.7は、FFmpeg本体に HE-AAC v2 デコーダが実装されたため、不要になりました。
バイナリはどれを使っても大丈夫だと思いますが、SSE2に対応していないCPU(Duron、Sempronの一部、Pentium3など)をお使いの方は、最適化無し版を使ってみてください。
最適化無し版でもエラーが出る場合は、サポート外とします。
zipファイルを解凍すると、ffmpeg.exeが出てきますので、携帯動画変換君のcoresフォルダに置くなり、単体で使うなりしてください。
pthreadGC2.dllは不要です。
携帯動画変換君のffmpeg.exeとは、オプションの互換性がありませんので、上書きする際はご注意ください。
FFmpegのコンパイルは、こちらの記事を参考にしてください。
コンパイル環境:MinGW gcc4.5.0
binutils-2.20.51
mingwrt-3.18
w32api-3.14
各ライブラリのバージョンは、以下の通りです。
nasm-2.08.01
yasm-1.0.1
pthreads-w32 release 2.9.0
zlib-1.2.5
bzip2-1.0.5
gsm-1.0.13
lame-3.98.4
opencore-amr-0.1.2
openssl-1.0.0a
rtmpdump-2.2e
libogg-1.2.0
libvorbis-1.3.1
libtheora-1.1.1
libvpx-0.9.1-13
x264 rev.1649
xvidcore-1.2.2
最適化オプションは、以下のようにしています。
configureのオプションに--enable-smallを付けると、gccのオプションに-Osが付きます。
--enable-smallを付けなければ、gccのオプションに-O3が付きます。
最適化無し版
--extra-cflags="-march=i686 -mtune=generic -fno-strict-aliasing"
Pentium4最適化版
--extra-cflags="-mtune=pentium4 -mfpmath=sse -msse -fno-strict-aliasing"
Core2最適化版
--extra-cflags="-mtune=core2 -mfpmath=sse -msse -fno-strict-aliasing"
Athlon64最適化版
--extra-cflags="-mtune=athlon64 -mfpmath=sse -msse -fno-strict-aliasing"
Phenom最適化版
--extra-cflags="-mtune=amdfam10 -mfpmath=sse -msse -fno-strict-aliasing"
configureオプションは以下の通りです。
$ ./configure --enable-memalign-hack --enable-gpl --enable-version3 --enable-postproc --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libgsm --enable-libmp3lame --enable-librtmp --enable-libvorbis --enable-libtheora --enable-libxvid --enable-libvpx --enable-libx264 --disable-ffserver --disable-ffplay --disable-ffprobe --enable-avisynth --enable-small --enable-pthreads --extra-ldflags=-static --extra-cflags="-mtune=athlon64 -mfpmath=sse -msse -fno-strict-aliasing"
※--extra-cflagsは、最適化の種類により異なります。
正確には記憶していませんがこのリビジョンぐらいから、出力した動画が無音になってしまうものが頻発するようになりました。
無音になるものは何度変換してもダメで、ファイルを比べても共通点が見当たりません。
なぜでしょうか??
横から失礼します。
どのようなコマンドで変換してるのかなども書かないと、管理人さんも原因の調べようがないと思います。
ご指摘ありがとうございます。
では、変換君のコマンドラインを書いておきます。
[Item*]
Title=NW-X1000用 アスペクト比4:3
Command0=""<%AppPath%>\cores\ffmpeg" -i "<%InputFile%>" -threads 0 -y -vcodec libx264 -level 21 -s 320x240 -aspect 4:3 -crf 16 -qmin 10 -qmax 51 -qdiff 4 -i_qfactor 0.71 -qcomp 0.6 -partitions +parti4x4+partp8x8 -me_method hex -me_range 16 -subq 6 -cmp +chroma -r 30 -keyint_min 30 -g 300 -sc_threshold 40 -bf 0 -refs 3 -flags +loop -flags2 +mbtree+mixed_refs -an "<%TemporaryFile%>_v.mp4""
Command1=""<%AppPath%>\cores\ffmpeg" -i "<%InputFile%>" -y -vn -acodec pcm_s16le -ac 2 -ar 44100 "<%TemporaryFile%>.wav""
Command2=""<%AppPath%>\cores\neroAacEnc" -q 0.35 -if "<%TemporaryFile%>.wav" -of "<%TemporaryFile%>_a.mp4""
Command3=""<%AppPath%>\cores\ffmpeg" -i "<%TemporaryFile%>_v.mp4" -i "<%TemporaryFile%>_a.mp4" -y -vcodec copy -acodec copy "<%OutputFile%>.mp4""
Command4=""<%AppPath%>\cores\ffmpeg" -i "<%InputFile%>" -y -ss 10 -vcodec mjpeg -s 160x120 -aspect 4:3 -vframes 1 -qscale 1 -an "<%OutputFile%>.jpg""
Command5="cmd /c "del "<%TemporaryFile%>*.*"""
優さん
代わりにお返事していただいてありがとうございました。
Minoさん
せっかく書いていただいたのですが、これだけで現象を再現するのは不可能に近いです。
不具合のあるソースの動画形式、音声形式。
同じ形式でも特定のソースだけ、など。
再生環境は?
Windows Media Player
Media Player Classic
foobar2000
Winamp
GOM Player など。
その他、iPod、iPhoneなどのポータブルプレーヤーなど。
不具合が出始めたFFmpegのリビジョン。
といった情報があれば、何か分かるかもしれません。
問題がなかった時のFFmpegをお使いいただくのが、手っ取り早いかと思います。
基本的には、「AAC系音声が絡む動画ファイルの入出力において、ランダムに発生する」模様で、私の普段の用途からして他にもたくさんの人に同じエラーが出ているのではないかと思います。
>不具合のあるソースの動画形式、音声形式。
どうやら音声がAAC系であること(デコードが怪しい?)
>同じ形式でも特定のソースだけ、など。
同じ条件でもエラーが出るものとそうでないものがあります。ただし同じソースは再変換しても結果は変わりません。
>再生環境は?
Media Player Classicとffdshow
>不具合が出始めたFFmpegのリビジョン。
おそらくrev.23711から
音声をwavに変換した時に、無音のwavが出来上がっているということでしょうか。
私も手持ちのサンプルで試してみたのですが、無音になるものはありませんでした。
何か分かりしだいご報告します。
早速で恐縮なんですが、質問させてください。
HDVの動画をサイズを変えずにH.264/aacへ4mbps程度に変更しようと思い以下のコマンドを入力したんですが、エラーが出てしまいました。
ちなみにこの映像の設定だとピクセルが荒くなってしまうのは何ででしょか?
ホントに初心者の質問で申し訳ありません。
設定↓
Title=input-HDV専用/1440*1080/29.97fps/3832kbps 168kbps
Command0=""<%AppPath%>\cores\ffmpeg23711" -y -i "<%InputFile%>" -vn -acodec pcm_s16le -ac 2 -ar 48000 "<%TemporaryFile%>.wav""
Command1=""<%AppPath%>\cores\neroAacEnc" -if "<%TemporaryFile%>.wav"" -lc -br 128000 -of "<%TemporaryFile%>.aac"
Command2=""<%AppPath%>\cores\ffmpeg23711" -y -i "<%TemporaryFile%>.aac" -acodec copy -i "<%InputFile%>" -vcodec libx264 -flags +bitexact+mv4 -coder 1 -bufsize 254k -g 150 -qcomp 0.7 -qmin 10 -qmax 51 -qdiff 4 -subq 6 -me_range 16 -i_qfactor 0.714286 -s 1440x1080 -aspect 16:9 -r 29.97 -b 3832 -f mp4 -threads 8 "<%OutputPath%>.MP4""
Command3=""rm"<%TemporaryFile%>.wav""
Command4=""rm"<%TemporaryFile%>.aac""
これで書き出すとこのようなエラーが・・・
T>Required Avisynth 2.5
T>kensyo.m2t (Project:ffmpegr23711 4mbps/input-HDV専用/1440*1080/29.97fps/3832kbps 168kbps)
E>"E:\kensyo\T\cores\ffmpeg23711" -y -i "E:\kensyo.m2t" -vn -acodec pcm_s16le -ac 2 -ar 48000 "C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\64AD1032-AE4003FB-BB24C616-DD55B44A.wav"
FFmpeg version SVN-r23711, Copyright (c) 2000-2010 the FFmpeg developers
built on Jun 23 2010 01:29:16 with gcc 4.5.0
configuration: --enable-memalign-hack --enable-gpl --enable-version3 --enable-postproc --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libgsm --enable-libmp3lame --enable-librtmp --enable-libvorbis --enable-libtheora --enable-libxvid --enable-libvpx --enable-libx264 --disable-ffserver --disable-ffplay --disable-ffprobe --enable-avisynth --enable-small --enable-pthreads --extra-ldflags=-static --extra-cflags='-mtune=core2 -mfpmath=sse -msse -fno-strict-aliasing'
libavutil 50.19. 0 / 50.19. 0
libavcodec 52.77. 1 / 52.77. 1
libavformat 52.71. 0 / 52.71. 0
libavdevice 52. 2. 0 / 52. 2. 0
libavfilter 1.20. 0 / 1.20. 0
libswscale 0.11. 0 / 0.11. 0
libpostproc 51. 2. 0 / 51. 2. 0
[NULL @ 0323bbc0]start time is not set in av_estimate_timings_from_pts
[NULL @ 032203c0]start time is not set in av_estimate_timings_from_pts
Input #0, mpegts, from 'E:\kensyo.m2t':
Duration: 00:05:09.96, start: 1.001000, bitrate: 26523 kb/s
Program 100
Stream #0.0[0x810]: Video: mpeg2video, yuv420p, 1440x1080 [PAR 4:3 DAR 16:9], 25000 kb/s, 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
Stream #0.1[0x814]: Audio: mp2, 48000 Hz, 2 channels, s16, 384 kb/s
Stream #0.2[0x815]: Data: [160][0][0][0] / 0x00A0
Stream #0.3[0x811]: Data: [161][0][0][0] / 0x00A1
Output #0, wav, to 'C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\64AD1032-AE4003FB-BB24C616-DD55B44A.wav':
Metadata:
encoder : Lavf52.71.0
Stream #0.0: Audio: pcm_s16le, 48000 Hz, 2 channels, s16, 1536 kb/s
Stream mapping:
Stream #0.1 -> #0.0
Press [q] to stop encoding
video:0kB audio:58122kB global headers:0kB muxing overhead 0.000074%
E>"E:\kensyo\T\cores\neroAacEnc" -if "C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\64AD1032-AE4003FB-BB24C616-DD55B44A.wav"" -lc -br 128000 -of "C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\64AD1032-AE4003FB-BB24C616-DD55B44A.aac
ERROR: no output file specified
宜しくお願いします
ご訪問くださいまして、ありがとうございます。
ERROR: no output file specified
と言われるのは、
Command1
"<%TemporaryFile%>.wav"" → 後ろの「"」が1個多いです。
"<%TemporaryFile%>.aac" → 後ろの「"」が1個足りません。
画質が粗いのは、ビットレートが小さいからです。
Command2
-b 3832 → -b 3832k または -b 3.832M
出力ファイルは、
"<%OutputPath%>.MP4" → "<%OutputFile%>.MP4"
あと、libx264に限り、-threads 0 で
core数 x 1.5 の小数以下切り捨て
の値に自動で設定してくれます。
Titleでは、音声168kbpsとなっていて、neroAacEncの設定では128000となっていますが、実際の設定の方が正しいのでしょうか。
修正すると、こんな感じです。
Title=input-HDV専用/1440*1080/29.97fps/3832kbps 128kbps
Command0=""<%AppPath%>\cores\ffmpeg" -y -i "<%InputFile%>" -vn -acodec pcm_s16le -ac 2 -ar 48000 "<%TemporaryFile%>.wav""
Command1=""<%AppPath%>\cores\neroAacEnc" -if "<%TemporaryFile%>.wav" -lc -br 128000 -of "<%TemporaryFile%>.aac""
Command2=""<%AppPath%>\cores\ffmpeg" -y -i "<%TemporaryFile%>.aac" -acodec copy -i "<%InputFile%>" -vcodec libx264 -flags +bitexact+mv4 -coder 1 -bufsize 254k -g 150 -qcomp 0.7 -qmin 10 -qmax 51 -qdiff 4 -subq 6 -me_range 16 -i_qfactor 0.714286 -s 1440x1080 -aspect 16:9 -r 29.97 -b 3832k -f mp4 -threads 0 "<%OutputFile%>.MP4""
Command3="rm "<%TemporaryFile%>.wav""
Command4="rm "<%TemporaryFile%>.aac""
お試しください。
音声のビットレート168kbpsが正しかったです。すみません。
あと-threads 0で最適にコアを使ってくれることも知らなかったので助かりました。
早速試してみます。
本当にありがとうございます。
上記に似たような症例で入力をBDレコーダーからTS抜きしたファイルをPSにVLCで変換したmpeg-psを入力すると「unkownfile」とはき出されてエンコードが止まることがあります。
同ファイルを各種プレイヤー、動画形式確認ソフトなどで確認しても異常がないんです。
ちなみにそのファイルをffmpeg 15972でエンコードすると問題なくエンコードできるので逃げの対処としてそちらを使用しています。
いつ、なぜが全く不明ですので今のffmpegでも発生する可能性が否定できません。
知らない間にデグってる可能性もありますので報告だけしておきます。
(エンコードに失敗するファイルを保存しおけば再現テストも出来るんですけど毎日山のようにエンコードしてるとテストしている余裕ないんです)
本来であればこのバージョンのffmpegで試したいところですが今時間的にかなり余裕がないので余裕が出来たらまた報告に来ます。
情報ありがとうございました。
残念ながら、私はBDレコーダーを持っていないので確認できません。
BDレコーダー欲しいです…。
Minoさんの件では、音声がAACの場合とのことですので、別の問題かもしれませんね。
ご報告お待ちしております。
実行は本バージョンで行いました。
目に見えて書かれていない部分でバージョンアップされているところが大きいですね。
以前、MPEG-PSファイルに変換必要だった局のうち次の局の入力が対応可能となっていることを確認しました。
・BSフジ
・BS11
現時点確実なのは、次の局です。
・NHK BS2
・毎日放送
・朝日放送
未確認(以前のバージョンでNGであった局)
・関西放送
・よみうりテレビ
・サンテレビ
・NHK総合
なんにしろ、mpeg-tsとひとくくりですけど対応非対応が大きかったですから変換の手間が減る(=音ずれが減る)は大きいです。
未確認の局も随時確認して行きます。
(その前にffmpegのバージョンをあげろよ、自分・・)
ちょっとまた困っています。助けてくださいm(__)m
ffmpegのバージョン23711での書き出しと、携帯動画変換君デフォルトのffmpeg(ver3790)だと、H.264書き出しの速度は23711の方が速いのは嬉しいんですが、23711の方だとブロックノイズが凄く出てしまいます。3790の方は遅いんですが、綺麗です。
以下が設定なんですが、お互いいいとこ取りの設定って出来ないですかね?
ffmpeg23711
Title=input-HDV専用/1440*1080/29.97fps/3832kbps 168kbps
Command0=""<%AppPath%>\cores\ffmpeg23711" -y -i "<%InputFile%>" -vn -acodec pcm_s16le -ac 2 -ar 48000 "<%TemporaryFile%>.wav""
Command1=""<%AppPath%>\cores\neroAacEnc" -if "<%TemporaryFile%>.wav" -lc -br 168000 -of "<%TemporaryFile%>.aac""
Command2=""<%AppPath%>\cores\ffmpeg23711" -y -i "<%TemporaryFile%>.aac" -acodec copy -i "<%InputFile%>" -flags +bitexact+mv4 -vcodec libx264 -coder 1 -copyts -bufsize 500k -g 180 -s 1440x1080 -r 29.97 -b 3832k -passlogfile "<%OutputFile%>" -pass 1 -f mp4 -threads 0 "<%OutputPath%><%InputFileBase%><%RandomNumber2%>(ver23711_1440-1080_CBR4mbps).MP4""
Command3="rm "<%TemporaryFile%>.wav""
Command4="rm "<%TemporaryFile%>.aac""
ffmpeg3790
Title=input-HD専用/1440*1080/29.97fps/3832kbps 168kbps
Command0=""<%AppPath%>\cores\ffmpeg3790" -y -i "<%InputFile%>" -title "<%Title%>" -timestamp "<%TimeStamp%>" -bitexact -vcodec h264 -coder 1 -copyts -bufsize 254k -g 250 -s 1440x1080 -r 29.97 -b 3832k -passlogfile "<%OutputFile%>" -pass 1 -acodec aac -ac 2 -ar 48000 -ab 168 -f mp4 -threads 0 "<%OutputPath%><%InputFileBase%><%RandomNumber2%>(ver3790_1440-1080_CBR4mbps).MP4""
宜しくお願いします。
ブロックノイズですが、元のソースでも出てませんか?
自分の場合、ブロックノイズが出ている時は元ソースを確認すると元々ブロックの伊豆が出ていることが多いです。
ブロックノイズを低減するオプションがあればいいんでしょうけど・・・
後、ビットレートを5mまであげてみるとほとんどソースと変わらない画像になりますよ。
tsファイル読み込ませですが、このバージョンで確認できた局です。
・NHK総合
・毎日放送
・サンテレビ
・朝日放送
・テレビ大阪
・関西テレビ
・よみうりテレビ
・BS11
・NHK BS2
以上、関西の地上波は全部直接tsファイルの読み込みが出来るようになりました。
BSでも他の局でも多分大丈夫になっていると思います。(普段録画しない局は調べてません)
参考にしてください。
(局や残したい動画によっては別のモノを使用しています)
[ItemX]
Title=H.264(23711)1440x1080P/4:3 x264 5M 2PASS
TitleE=
Command0=""<%AppPath%>\cores\ffmpeg-23711" -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-23711" -threads 2 -y -i "<%InputFile%>" -timestamp "<%TimeStamp%>" -deinterlace -pass 1 -passlogfile <%TemporaryFile%> -vcodec libx264 -coder 1 -flags bitexact -flags2 +mbtree -g 150 -qcomp 0.7 -qmin 10 -qmax 51 -qdiff 4 -subq 6 -me_range 16 -i_qfactor 0.714286 -s 1440x1080 -r 29.97 -vb 5000k -aspect 4:3 -an -f mp4 "<%TemporaryFile%>.mp4""
Command3=""<%AppPath%>\cores\ffmpeg-23711" -threads 2 -y -i "<%InputFile%>" -timestamp "<%TimeStamp%>" -deinterlace -pass 2 -passlogfile <%TemporaryFile%> -vcodec libx264 -coder 1 -flags bitexact -flags2 +mbtree -g 150 -qcomp 0.7 -qmin 10 -qmax 51 -qdiff 4 -subq 6 -me_range 16 -i_qfactor 0.714286 -s 1440x1080 -r 29.97 -vb 5000k -aspect 4:3 -an -f mp4 "<%TemporaryFile%>.mp4""
Command4=""<%AppPath%>\cores\ffmpeg-23711" -y -i "<%TemporaryFile%>.mp4" -vcodec copy -i "<%TemporaryFile%>.aac" -acodec copy -async 95 -f mp4 "<%OutputFile%>.mp4""
Command5="rm "<%TemporaryFile%>.wav""
Command6="rm "<%TemporaryFile%>.aac""
Command7="rm "<%TimeStamp%>""
Command8="rm "<%TemporaryFile%>.mp4""
-bufsizeの値が小さすぎてエンコ結果が指定したビットレートを大きく下回ってるのと、
2パス用のオプション(-passlogfile "<%OutputFile%>" -pass 1)が使われてるのに1パス目のみで2パス目が存在しないのが一番の原因ではないでしょうか?
-bufsizeは再生する機器の処理能力に合わせて再生互換性を保つために-maxrateと一緒に指定する物なのでPC用の場合は特につける必要はありませんよ。
もし使う場合は端末が対応してる出来るだけ大きな値を推奨。
値の参考はこの辺とか
http://rob.opendot.cl/index.php/useful-stuff/h264-profiles-and-levels/
あとあまり関係ないけどmv4はx264用のオプションではないので付けても意味はありません。
とても参考になりました。
本当にありがとうございます。
PC用途ですので確かにバッファの設定はいらないですね。
あと、mv4のコマンドもいらなかったんですね・・・
もうちょっと勉強します。
ありがとうございました。
すみません。返信遅れました。
いろいろとお力添えありがとうございます。
ブロックノイズの件ですが、元ソースは
自分で撮った映像です。
ほぼ非圧縮で編集してHDVにしました。
HDVのソースは特にブロックノイズは出ていません。(まぁ、25mbpsもあるんで)
それを4Mbpsまで落とさないといけなくて(汗)
ブロックノイズの軽減はffmpegの設定にも限界があるんですかね?・・。
あと、AVCHDのTS形式のコンテナにしてみても意味はないですかね?
ffmpegというよりlibx264固有のオプションを調べてみてはいかがでしょうか?
同じffmpegをベースとしたHandbrakeでは「デブロック」オプションがありますから、libx264でデブロックオプションはあると思います。
それか、携帯動画変換君にこだわらずにHandbrakeを使ってみるかですね。
ソースの入力は動画ファイル可ですから。
(DVDエンコーダーのイメージがありますがH.264エンコードのソフトとして有効に活用できますから)
この部分についてはもう少しここの話題からずれますからここまでにしておきます。
あとはいきなり4Mbitまで圧縮するのではなくて、特にブロックノイズの多いところを切り出して10Mbit/5Mbitと縮めて画質の比較をしてみるのも一つかと思います。
(自分の場合、TSファイルの某ナイトスクープを3Mbitまで圧縮してますが特に目立つようなブロックノイズは出ていません、まぁそのかわり止め絵は見れたモノじゃありませんが・・・)
返信遅れてすみません。
HandBrakeは試したんですが、諸事情によりffmpegでの設定をつめなくてはいけなくて・・・
ブロックノイズの多いところを切り出してみるのも良いかもしれません。試してみます。ありがとうございました。