ffmpegを使って
ffmpeg -i smile.flv -acodec copy output.mp3
ってな感じでflv動画から音を抜いてるんですが、これをやったあとに付きまとう問題点。。。
元の音声がVBRだろうと何だろうと、-acodec copyでとにかく抜き出せるのは良いものの、抜き出して出来たファイルにはVBRヘッダが無いので、プレーヤによっては再生時間がとんでもないことになっちゃったりします。
例えば、実際の再生時間は4分程度の筈なのに、32分として扱われちゃったり。
なので、VBRヘッダをファイルに付加する方法を探してたんですが、linux環境向けのツールを見つけられませんでした。。。
なので、とりあえずWindows向けのVBR Header Makerをwineで使用。
うわぁ、、こんな簡単に出来るのになぁ。。。
2009年5月22日金曜日
2008年12月24日水曜日
encode video with h264+aac codecs by ffmpeg on Ubuntu8.10 Intrepid Ibex
Ubuntu8.04まではMedibuntuのリポジトリを入れていれば、h264,aacなどのコーデックに対応した版のffmpegがaptでインストール出来たのですが、8.10からやり方が変わったようです。
ffmpegでPSP用に動画をエンコードしようとして、「h264なんてエンコーダ知らないよ」とエラーメッセージを吐かれてびっくらこきました。
確かに、ffmpeg -formatsの出力結果のCodec欄を見ても、h264の行にエンコード可を示すEの字がありません。
Medibuntuの8.04Hardy用のパッケージ一覧ページを見るとちゃんとffmpegがあるのが分かりますが、8.10Intrepidのページではffmpegがそもそもffmpegがありません。
Intrepidでは、ffmpeg本体は公式リポジトリのものを使い、h264などのエンコードには外部ライブラリで対応するという形のようです。
IntrepidのMedibuntuリポジトリを入れた状態で、libavcodec-unstripped-51,libavdevice-unstripped-52,libavformat-unstripped-52,libavutil-unstripped-49,libpostproc-unstripped-51,libswscale-unstripped-0の6つのパッケージをインストールします。
Ubuntu公式のリポジトリにはlibavformat52といったパッケージがありますが、これらのMedibutu版が〜-unstripped-〜と名前についたパッケージ達です。ffmpeg本体は公式のもののままで大丈夫のはずです。
これでffmpeg -formatsを実行すると、h264のところはそのままですが、「 EV libx264」という行が追加されている筈です。libx264というのはh264コーデックでエンコードするためのffmpeg外部のライブラリです。(libx264パッケージは勝手にインストールされます)
実際にエンコードを行う場合には、以前なら「-vcodec h264」としていた箇所を、「-vcodec libx264」とすれば良いです。aacも、libfaacとします。
この他にも、外部ライブラリとして対応するようになったものがあります(ogg,xvidなど)。ffmpeg -formatsで確認してください。
試しに、一つ動画をPSP用にエンコードしてみましたが問題なく再生出来ました。

ffmpegでPSP用に動画をエンコードしようとして、「h264なんてエンコーダ知らないよ」とエラーメッセージを吐かれてびっくらこきました。
確かに、ffmpeg -formatsの出力結果のCodec欄を見ても、h264の行にエンコード可を示すEの字がありません。
Medibuntuの8.04Hardy用のパッケージ一覧ページを見るとちゃんとffmpegがあるのが分かりますが、8.10Intrepidのページではffmpegがそもそもffmpegがありません。
Intrepidでは、ffmpeg本体は公式リポジトリのものを使い、h264などのエンコードには外部ライブラリで対応するという形のようです。
IntrepidのMedibuntuリポジトリを入れた状態で、libavcodec-unstripped-51,libavdevice-unstripped-52,libavformat-unstripped-52,libavutil-unstripped-49,libpostproc-unstripped-51,libswscale-unstripped-0の6つのパッケージをインストールします。
$ sudo apt-get install libavcodec-unstripped-51 libavdevice-unstripped-52 \
libavformat-unstripped-52 libavutil-unstripped-49 libpostproc-unstripped-51 \
libswscale-unstripped-0
Ubuntu公式のリポジトリにはlibavformat52といったパッケージがありますが、これらのMedibutu版が〜-unstripped-〜と名前についたパッケージ達です。ffmpeg本体は公式のもののままで大丈夫のはずです。
これでffmpeg -formatsを実行すると、h264のところはそのままですが、「 EV libx264」という行が追加されている筈です。libx264というのはh264コーデックでエンコードするためのffmpeg外部のライブラリです。(libx264パッケージは勝手にインストールされます)
実際にエンコードを行う場合には、以前なら「-vcodec h264」としていた箇所を、「-vcodec libx264」とすれば良いです。aacも、libfaacとします。
この他にも、外部ライブラリとして対応するようになったものがあります(ogg,xvidなど)。ffmpeg -formatsで確認してください。
試しに、一つ動画をPSP用にエンコードしてみましたが問題なく再生出来ました。

$ ffmpeg -i smile.flv -acodec libfaac -ab 256kb -vcodec libx264 -b 256kb -ar 48000 -mbd 2 -coder 1 -cmp 2 -subcmp 2 -aspect 360:272 -s 360x272 -r 30000/1001 -f psp -flags loop -trellis 2 -level 30 -threads 2 output.mp4 -y
2008年11月28日金曜日
ffmpeg for psp
ただの覚書。
内容については保証できない。
成功例
$ ffmpeg -i input.mp4 -acodec aac -ab 128kb -vcodec h264 -b 1200kb -ar 48000 -mbd 2 -coder 1 -cmp 2 -subcmp 2 -aspect 480:272 -s 480x272 -r 30000/1001 -f psp -flags loop -trellis 2 -level 30 output.mp4
参考:http://d.hatena.ne.jp/amt/20070422/LevelOptions
ffmpeg -i input.mp4 -acodec aac -ab 128kb -vcodec h264 -b 1200kb -ar 48000 -mbd 2 -coder 1 -cmp 2 -subcmp 2 -aspect 480:272 -s 480x312 -r 30000/1001 -f psp -flags loop -trellis 2 -level 30 -croptop 20 -cropbottom 20 output.mp4
$ ffmpeg -i smile.mp4 -f psp -s 320x240 -r 29.97 -b 768k -ar 24000 -ab 128k output.mp4
$ ffmpeg -i smile.mp4 -f psp -aspect 16:9 -s 320x272 -croptop 46 -cropbottom 46 -r 29.97 -b 256k -ar 24000 -ab 128k croppedoutput.mp4
memo
cropの不思議(Ubuntuのリポジトリにはいってるffmpegで確認)
cropで指定するピクセル数は元動画の画面サイズからいくら引くか、で考える。
画面サイズを縮小する場合もそう。ただし、-s指定する画面サイズは「縮小後サイズ+元動画からcropするピクセル数」とする。そうしないと、動画のプロパティ上と実際のデータと違うサイズとなる。
となる。
サムネイル
ffmpeg -i saihateband.mp4 -f image2 -ss 7 -vframes 1 -s 160x120 -an test.jpg
内容については保証できない。
成功例
$ ffmpeg -i input.mp4 -acodec aac -ab 128kb -vcodec h264 -b 1200kb -ar 48000 -mbd 2 -coder 1 -cmp 2 -subcmp 2 -aspect 480:272 -s 480x272 -r 30000/1001 -f psp -flags loop -trellis 2 -level 30 output.mp4
参考:http://d.hatena.ne.jp/amt/20070422/LevelOptions
ffmpeg -i input.mp4 -acodec aac -ab 128kb -vcodec h264 -b 1200kb -ar 48000 -mbd 2 -coder 1 -cmp 2 -subcmp 2 -aspect 480:272 -s 480x312 -r 30000/1001 -f psp -flags loop -trellis 2 -level 30 -croptop 20 -cropbottom 20 output.mp4
$ ffmpeg -i smile.mp4 -f psp -s 320x240 -r 29.97 -b 768k -ar 24000 -ab 128k output.mp4
$ ffmpeg -i smile.mp4 -f psp -aspect 16:9 -s 320x272 -croptop 46 -cropbottom 46 -r 29.97 -b 256k -ar 24000 -ab 128k croppedoutput.mp4
memo
cropの不思議(Ubuntuのリポジトリにはいってるffmpegで確認)
cropで指定するピクセル数は元動画の画面サイズからいくら引くか、で考える。
画面サイズを縮小する場合もそう。ただし、-s指定する画面サイズは「縮小後サイズ+元動画からcropするピクセル数」とする。そうしないと、動画のプロパティ上と実際のデータと違うサイズとなる。
となる。
サムネイル
ffmpeg -i saihateband.mp4 -f image2 -ss 7 -vframes 1 -s 160x120 -an test.jpg
2008年11月7日金曜日
PSP向け動画をffmpegでエンコードする覚書
PSP向け動画をちょっと高画質にffmpegでエンコードする覚書
Ubuntu8.04のリポジトリに入ってるffmpegで検証。
こちらのページを参考
http://d.hatena.ne.jp/amt/20070422/LevelOptions
成功例
$ ffmpeg -i input.mp4 -acodec aac -ab 128kb -vcodec h264 -b 1200kb -ar 48000 -mbd 2 -coder 1 -cmp 2 -subcmp 2 -aspect 480:272 -s 480x272 -r 30000/1001 -f psp -flags loop -trellis 2 -level 30 output.mp4
cropを使う場合
$ ffmpeg -i input.mp4 -acodec aac -ab 128kb -vcodec h264 -b 1200kb -ar 48000 -mbd 2 -coder 1 -cmp 2 -subcmp 2 -aspect 480:272 -s 480x312 -r 30000/1001 -f psp -flags loop -trellis 2 -level 30 -croptop 20 -cropbottom 20 output.mp4
cropで指定する値は、元動画の画面サイズにおいてcropするピクセル数。
ただし、-sオプションで指定する変換後画面サイズは「目的のサイズ+元動画からcropするピクセル数」とする。cropに指定した値が、-sで指定した値から引かれて、出力される動画のプロパティに収まる。
具体的には、
入力動画の画面サイズ - 入力動画からcropするピクセル数 = 出力動画の画面サイズ
-sで指定した画面サイズ - 入力動画からcropするピクセル数 = 出力動画のプロパティ上の画面サイズ
となってしまうみたい。んで、よく分からんのだけれども、目的のサイズは480x272なのに、上下20ピクセルずつcropするので、480x312としておいた方が良いみたい。いずれにしろ出力される動画は480x272となってくれる。
どう考えてもこれバグじゃないの?と思うんだけれど、最新版のffmpeg試してないからあんまりとやかく言わないことにする。
Ubuntu8.04のリポジトリに入ってるffmpegで検証。
こちらのページを参考
http://d.hatena.ne.jp/amt/20070422/LevelOptions
成功例
$ ffmpeg -i input.mp4 -acodec aac -ab 128kb -vcodec h264 -b 1200kb -ar 48000 -mbd 2 -coder 1 -cmp 2 -subcmp 2 -aspect 480:272 -s 480x272 -r 30000/1001 -f psp -flags loop -trellis 2 -level 30 output.mp4
cropを使う場合
$ ffmpeg -i input.mp4 -acodec aac -ab 128kb -vcodec h264 -b 1200kb -ar 48000 -mbd 2 -coder 1 -cmp 2 -subcmp 2 -aspect 480:272 -s 480x312 -r 30000/1001 -f psp -flags loop -trellis 2 -level 30 -croptop 20 -cropbottom 20 output.mp4
cropで指定する値は、元動画の画面サイズにおいてcropするピクセル数。
ただし、-sオプションで指定する変換後画面サイズは「目的のサイズ+元動画からcropするピクセル数」とする。cropに指定した値が、-sで指定した値から引かれて、出力される動画のプロパティに収まる。
具体的には、
入力動画の画面サイズ - 入力動画からcropするピクセル数 = 出力動画の画面サイズ
-sで指定した画面サイズ - 入力動画からcropするピクセル数 = 出力動画のプロパティ上の画面サイズ
となってしまうみたい。んで、よく分からんのだけれども、目的のサイズは480x272なのに、上下20ピクセルずつcropするので、480x312としておいた方が良いみたい。いずれにしろ出力される動画は480x272となってくれる。
どう考えてもこれバグじゃないの?と思うんだけれど、最新版のffmpeg試してないからあんまりとやかく言わないことにする。
2008年8月12日火曜日
ffmpegでニコニコ動画用のmp4動画を作る
一昨日のエントリで愚痴をこぼしましたが、あとあとmp4で再エンコせずにしっかりアップ出来ました。
参考にしたのはこちら↓
エンコード設定(中画質~高画質) - ニコニコ動画まとめwiki: ffmpegを用いてmp4(H.264、AAC)で2passエンコードする
http://nicowiki.com/%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%89%E8%A8%AD%E5%AE%9A%EF%BC%88%E4%B8%AD%E7%94%BB%E8%B3%AA%EF%BD%9E%E9%AB%98%E7%94%BB%E8%B3%AA%EF%BC%89.html#teeca4db
「まとめWikiじゃねぇか!」と怒らないで orz
わかってます。基本目を通すべきだってのはわかってます。でも、素で見逃してました('A`)
んで、本題。
上記ページに、ffmpegを用いてmp4で2passエンコードする場合のコマンドの例が書かれています。
コーデック指定にlibx264・libfaacと指定していますが、Ubuntu 8.04のaptでインストールできるffmpegのversionでは、そのままh264・aacと指定できます。("$ ffmpeg -formats"の出力結果参照)
<20081222追記>
Ubuntu8.04のリポジトリでなく、正確にはMedibuntuのUbuntu8.04向けリポジトリだったかと
(以降のコマンドラインの例は、私が実際に行ったものとはちょっと違っています。入力動画を切り分けるために-tオプションを使いましたが、一般例としては必要ないので割愛しました。また、ファイル名もわかりやすく変えてあります。)
私はとりあえず普通に1passで試してみました。
ビットレートが 動画300k + 音声64k = 364k となるかと思いきや、この結果出てきたファイルは570kbpsでした。
どうやら、実際に指定している値より高めになるようです。このために、初め動画のビットレートを500kと指定した時には700kbps台のファイルが出来てしまい、ちょうど良いbpsになるように何度も繰り返す羽目に。(そういうもんなのかな?)
それと2passの場合。
こちらの場合は、動画のビットレートが指定したとおりにエンコードされました。
1passも2passもニコニコ動画に再エンコード無しでアップロード出来ました。
ただし、いずれも実際にうpした後のデータをダウンロードしてみると、元のファイルと少しファイルサイズやヘッダが違っているようです。bpsも少しだけ食い違っています。
ですが、大幅に画質が落ちたりしていないので、再エンコードはされていないと判断してます。ニコニコ動画の仕様で、適切なエンコードを行っていたとしても、うpされたデータは必ずエンコード処理に通されます(エンコードしています、とページに表示される)。その時に、実際には再エンコードされていなくても、ヘッダファイルの内容だけ書き変えたりしているのかも。
ちなみに、テストでうpしたその動画は短い上に元の映像も私のデスクトップをキャプチャした少し質の悪いものだったので、1passと2passの差がまったく分かりませんでした orz
再生時間がそれなりに長い動画でなければ違いは出てこないんじゃないかと思うので、よほど質を気にしなければ1passで十分です。
実際にうpした動画のスクリーンショット。
flvでエンコードしたが、再エンコされてしまった場合。
+-+Mozilla+Firefox.png)
1passのmp4+aacで、再エンコ無しの場合。
+-+Mozilla+Firefox.png)
やはり、後者の方が圧倒的に綺麗です。文字もくっきり見えて読めます。(当たり前か)
それと最後に注意事項。私と同じ轍を踏む方が一人でもいなくなるように。。。
エンコードする際には必ず、-s -b -r(画面サイズ・映像ビットレート・映像フレームレート)などの値を指定しましょう。オプション指定せずにffmpegのデフォルト値のままでエンコードして40MB以下/600kbps以下になるとしても、ちゃんと指定しないと何故かうpしたときにエンコード処理の時点でエラーで弾かれます。
一昨日あたりに失敗した時は、元の動画を作成する時点(デスクトップのキャプチャ)でサイズが512x384になるようにしていたので、ffmpegによるエンコード時点では-sオプションを使いませんでした。また、フレームレートもデフォルトのままで良いと思い、-rを指定しませんでした。
確証はありませんが、これが失敗した原因だと思います。デフォルト値と同じ値だったとしても、指定した場合としなかった場合では書き出されるヘッダが違っているのではないかと私は思っています。
それと、エンコードした動画を確認するのにTotemは使わない方が良いでしょう。Totemに限らずGstreamerを使っているプレイヤーではAdobeの純正のflash playerに比べ再生時の画質がかなり落ちるようです。
Linux上のブラウザでflashを再生するのにGnashなど使っている方もいると思うのですが、私はAdobe純正のプラグインを使っています。
http://www.adobe.com/go/gntray_dl_getflashplayer_jp
Gnashなど他のプレーヤーのプラグインと比べた訳ではないので、純正が1番と言うつもりはないですが。
兎に角、これで良画質でニコニコ動画にうpできるようになりました^^
<追記>
Ubuntuのバージョン間違えてました。この記事書いた時点では8.10は出てない出てない。
参考にしたのはこちら↓
エンコード設定(中画質~高画質) - ニコニコ動画まとめwiki: ffmpegを用いてmp4(H.264、AAC)で2passエンコードする
http://nicowiki.com/%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%89%E8%A8%AD%E5%AE%9A%EF%BC%88%E4%B8%AD%E7%94%BB%E8%B3%AA%EF%BD%9E%E9%AB%98%E7%94%BB%E8%B3%AA%EF%BC%89.html#teeca4db
「まとめWikiじゃねぇか!」と怒らないで orz
わかってます。基本目を通すべきだってのはわかってます。でも、素で見逃してました('A`)
んで、本題。
上記ページに、ffmpegを用いてmp4で2passエンコードする場合のコマンドの例が書かれています。
コーデック指定にlibx264・libfaacと指定していますが、Ubuntu 8.04のaptでインストールできるffmpegのversionでは、そのままh264・aacと指定できます。("$ ffmpeg -formats"の出力結果参照)
<20081222追記>
Ubuntu8.04のリポジトリでなく、正確にはMedibuntuのUbuntu8.04向けリポジトリだったかと
(以降のコマンドラインの例は、私が実際に行ったものとはちょっと違っています。入力動画を切り分けるために-tオプションを使いましたが、一般例としては必要ないので割愛しました。また、ファイル名もわかりやすく変えてあります。)
私はとりあえず普通に1passで試してみました。
$ ffmpeg -i input.mpeg -i input.mp3 -s 512x384 -vcodec h264 -b 300k -r 25.00 -acodec aac -ab 64k -ar 44100 output.mp4
ビットレートが 動画300k + 音声64k = 364k となるかと思いきや、この結果出てきたファイルは570kbpsでした。
どうやら、実際に指定している値より高めになるようです。このために、初め動画のビットレートを500kと指定した時には700kbps台のファイルが出来てしまい、ちょうど良いbpsになるように何度も繰り返す羽目に。(そういうもんなのかな?)
それと2passの場合。
$ ffmpeg -i input.mpeg -vcodec h264 -r 25.00 -b 500k -s 512x384 -pass 1 -passlogfile "./passlog" -an "./1pass.mp4"
$ ffmpeg -i input.mpeg -vcodec h264 -r 25.00 -b 500k -s 512x384 -pass 2 -passlogfile "./passlog" -i input.mp3 -acodec aac -ar 44100 -ab 64k "./2pass.mp4"
こちらの場合は、動画のビットレートが指定したとおりにエンコードされました。
1passも2passもニコニコ動画に再エンコード無しでアップロード出来ました。
ただし、いずれも実際にうpした後のデータをダウンロードしてみると、元のファイルと少しファイルサイズやヘッダが違っているようです。bpsも少しだけ食い違っています。
ですが、大幅に画質が落ちたりしていないので、再エンコードはされていないと判断してます。ニコニコ動画の仕様で、適切なエンコードを行っていたとしても、うpされたデータは必ずエンコード処理に通されます(エンコードしています、とページに表示される)。その時に、実際には再エンコードされていなくても、ヘッダファイルの内容だけ書き変えたりしているのかも。
ちなみに、テストでうpしたその動画は短い上に元の映像も私のデスクトップをキャプチャした少し質の悪いものだったので、1passと2passの差がまったく分かりませんでした orz
再生時間がそれなりに長い動画でなければ違いは出てこないんじゃないかと思うので、よほど質を気にしなければ1passで十分です。
実際にうpした動画のスクリーンショット。
flvでエンコードしたが、再エンコされてしまった場合。
+-+Mozilla+Firefox.png)
1passのmp4+aacで、再エンコ無しの場合。
+-+Mozilla+Firefox.png)
やはり、後者の方が圧倒的に綺麗です。文字もくっきり見えて読めます。(当たり前か)
それと最後に注意事項。私と同じ轍を踏む方が一人でもいなくなるように。。。
エンコードする際には必ず、-s -b -r(画面サイズ・映像ビットレート・映像フレームレート)などの値を指定しましょう。オプション指定せずにffmpegのデフォルト値のままでエンコードして40MB以下/600kbps以下になるとしても、ちゃんと指定しないと何故かうpしたときにエンコード処理の時点でエラーで弾かれます。
一昨日あたりに失敗した時は、元の動画を作成する時点(デスクトップのキャプチャ)でサイズが512x384になるようにしていたので、ffmpegによるエンコード時点では-sオプションを使いませんでした。また、フレームレートもデフォルトのままで良いと思い、-rを指定しませんでした。
確証はありませんが、これが失敗した原因だと思います。デフォルト値と同じ値だったとしても、指定した場合としなかった場合では書き出されるヘッダが違っているのではないかと私は思っています。
それと、エンコードした動画を確認するのにTotemは使わない方が良いでしょう。Totemに限らずGstreamerを使っているプレイヤーではAdobeの純正のflash playerに比べ再生時の画質がかなり落ちるようです。
Linux上のブラウザでflashを再生するのにGnashなど使っている方もいると思うのですが、私はAdobe純正のプラグインを使っています。
http://www.adobe.com/go/gntray_dl_getflashplayer_jp
Gnashなど他のプレーヤーのプラグインと比べた訳ではないので、純正が1番と言うつもりはないですが。
兎に角、これで良画質でニコニコ動画にうpできるようになりました^^
<追記>
Ubuntuのバージョン間違えてました。この記事書いた時点では8.10は出てない出てない。
2008年8月10日日曜日
ffmpegはニコ動と相性が悪い?
というか、ニコニコ動画のほうが制限かけすぎな感じがする。
ffmpegで作ったflvファイルは、再エンコされたかと思ったら、ファイルヘッダがおかしいといわれ終了。
再エンコありきで考えて、画質の出来るだけ良い動画をそのままうpするのが手っ取り早いけど、それをやると負けかなと思っている。
やっと作った動画をうpようとしたらこんな風に弾かれて、時間だけ消費して悲しくなった、という記事。
<追記>
解決しました。
ffmpegでニコニコ動画用のmp4動画を作る
ffmpegで作ったflvファイルは、再エンコされたかと思ったら、ファイルヘッダがおかしいといわれ終了。
再エンコありきで考えて、画質の出来るだけ良い動画をそのままうpするのが手っ取り早いけど、それをやると負けかなと思っている。
やっと作った動画をうpようとしたらこんな風に弾かれて、時間だけ消費して悲しくなった、という記事。
<追記>
解決しました。
ffmpegでニコニコ動画用のmp4動画を作る
2008年7月28日月曜日
ffmpegで動画から音声を分離
ffmpegを使うと、動画から音声を分離したりするのは簡単にできる。
まず、音声コーデックをチェック
音声コーデックがaacなので、出力先の拡張子をaacとする。
(<追記>aacはあくまでコーデックであり、ファイル形式(コンテナ)とは違うんですけどね)
ffmpegでは出力先に指定したファイル名の拡張子で、出力するファイルフォーマットを判断するので、先に必ず動画の音声コーデックをチェックしなければならない。音声コーデックがaacなのにmp3などの拡張子を付けるとエラーになる。
単純作業なので、動画から一発で音声を分離してくれるスクリプトでも組もうかと思ったのだが、実際は意外と面倒そう。
ffmpegは数々のフォーマットに対応しており、まずフォーマットと拡張子の対応テーブルを作らなければならないし、デコード出来てもエンコード出来ない、またはその逆のフォーマットもある。更には、出力にoutput.wmaと指定したら、WindowsMediaAudioの筈なのに動画ストリーム付きでファイルを書き出してくれたり。。。
正直、手作業の方が気楽。
<追記>
WMAとWMVってコンテナの形式は同じで、オーディオだけならWMA、動画ならWMVって違いなだけじゃね?と気付いた。
ちゃんとストリーム指定して出力すりゃいいのかな?
まず、音声コーデックをチェック
$ ffmpeg -i input.mp4 2>&1|grep Audio
Stream #0.1(und): Audio: aac, 44100 Hz, stereo
$
音声コーデックがaacなので、出力先の拡張子をaacとする。
$ ffmpeg -i input.mp4 -acodec copy output.aac
(<追記>aacはあくまでコーデックであり、ファイル形式(コンテナ)とは違うんですけどね)
ffmpegでは出力先に指定したファイル名の拡張子で、出力するファイルフォーマットを判断するので、先に必ず動画の音声コーデックをチェックしなければならない。音声コーデックがaacなのにmp3などの拡張子を付けるとエラーになる。
単純作業なので、動画から一発で音声を分離してくれるスクリプトでも組もうかと思ったのだが、実際は意外と面倒そう。
ffmpegは数々のフォーマットに対応しており、まずフォーマットと拡張子の対応テーブルを作らなければならないし、デコード出来てもエンコード出来ない、またはその逆のフォーマットもある。更には、出力にoutput.wmaと指定したら、WindowsMediaAudioの筈なのに動画ストリーム付きでファイルを書き出してくれたり。。。
正直、手作業の方が気楽。
<追記>
WMAとWMVってコンテナの形式は同じで、オーディオだけならWMA、動画ならWMVって違いなだけじゃね?と気付いた。
ちゃんとストリーム指定して出力すりゃいいのかな?
2008年7月27日日曜日
端末で動画のフォーマットを確認する の続き
一昨日のエントリで、端末からffmpegで動画のフォーマットを確認できることを確認したが、ffmpegのhelpなど余計なのも出力されてしまっていた。
「grepすればいいじゃん。何言ってんの?」とは言わないで欲しい。
だって、
こうなっちゃうんだもの。
どうしてかなぁと思ってたのだが、「ffmpeg 標準出力」でググったらこの理由が分かった。
ffmpegが出力するこの文字列、実は標準出力ではなく標準エラー出力で吐き出されているそうなのだ。パイプで繋いでも標準エラー出力はgrepに渡ってくれず、標準エラー出力はそのまま表示されていたという訳。
ここまで分かれば簡単、標準エラー出力を標準出力にリダイレクションしてやればいいので、
これでOK。
つか、やっぱり同じことを考えてる先達はいた訳だけど、「ffmpeg 動画 情報」とかでググっても出てこなかったのが、「ffmpeg 標準出力」で一発だったのが泣ける。
<追記>
grepよりtailのほうがいいかも。
「grepすればいいじゃん。何言ってんの?」とは言わないで欲しい。
だって、
$ ffmpeg -i smile.mp4 |grep Stream
FFmpeg version SVN-rUNKNOWN, Copyright (c) 2000-2007 Fabrice Bellard, et al.
configuration: --enable-gpl --enable-pp --enable-swscaler --enable-pthreads --enable-libvorbis --enable-libtheora --enable-libogg --enable-libgsm --enable-dc1394 --disable-debug --enable-libmp3lame --enable-libfaadbin --enable-libfaad --enable-libfaac --enable-xvid --enable-x264 --enable-liba52 --enable-amr_nb --enable-amr_wb --enable-shared --prefix=/usr
libavutil version: 1d.49.3.0
libavcodec version: 1d.51.38.0
libavformat version: 1d.51.10.0
built on Jul 16 2008 19:54:40, gcc: 4.2.3 (Ubuntu 4.2.3-2ubuntu7)
Seems stream 0 codec frame rate differs from container frame rate: 119.88 (120000/1001) -> 30.58 (367/12)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'smile.mp4':
Duration: 00:09:50.0, start: 0.000000, bitrate: 531 kb/s
Stream #0.0(und): Video: h264, yuv420p, 512x384, 30.58 fps(r)
Stream #0.1(und): Audio: aac, 44100 Hz, stereo
Must supply at least one output file
$
こうなっちゃうんだもの。
どうしてかなぁと思ってたのだが、「ffmpeg 標準出力」でググったらこの理由が分かった。
ffmpegが出力するこの文字列、実は標準出力ではなく標準エラー出力で吐き出されているそうなのだ。パイプで繋いでも標準エラー出力はgrepに渡ってくれず、標準エラー出力はそのまま表示されていたという訳。
ここまで分かれば簡単、標準エラー出力を標準出力にリダイレクションしてやればいいので、
$ ffmpeg -i smile.mp4 2>&1 | grep Stream
Stream #0.0(und): Video: h264, yuv420p, 512x384, 30.58 fps(r)
Stream #0.1(und): Audio: aac, 44100 Hz, stereo
$
これでOK。
つか、やっぱり同じことを考えてる先達はいた訳だけど、「ffmpeg 動画 情報」とかでググっても出てこなかったのが、「ffmpeg 標準出力」で一発だったのが泣ける。
<追記>
grepよりtailのほうがいいかも。
$ ffmpeg -i input.mp4 2>&1 | tail -n 5
2008年7月25日金曜日
端末で動画のフォーマットを確認する
Linuxを端末でいじってる時に、動画ファイルのコーデックなどを確認したい場合がある。ffmpegで動画を変換しようとする時とか。
ffmpegでは、エンコードする時に端末に動画の情報が表示されるが、それをする前に知りたいんだっつーの。情報を見るためffmpegを立ち上げエンコを速攻キャンセル、なんてなぁ。。。
そんな時に、いちいちnautilusを立ち上げ→ファイルアイコンのコンテキストメニュー→プロパティ→音声/動画タブを見る、なんてことしたくない。
コマンドでサクッと表示したい場合はどうするか。
いろいろググって見たはいいものの、なかなかそれらしいものは見つからない。
諦めて、やはりffmpegで見るしかないのか、、、と思ったがある事に気がついた。
ffmpegで入力ファイルだけ引数に与えたらどうなるだろう。。。
つーわけで、次みたいに端末を叩いてみた。
smile.mp4はニコ動から落としてきた適当なファイル。
余計なものも表示されてしまったが、最後のほうでしっかり知りたかった情報が表示されている。
とりあえず、目的は達成したけど。。。なんか納得できない。
ffmpegでは、エンコードする時に端末に動画の情報が表示されるが、それをする前に知りたいんだっつーの。情報を見るためffmpegを立ち上げエンコを速攻キャンセル、なんてなぁ。。。
そんな時に、いちいちnautilusを立ち上げ→ファイルアイコンのコンテキストメニュー→プロパティ→音声/動画タブを見る、なんてことしたくない。
コマンドでサクッと表示したい場合はどうするか。
いろいろググって見たはいいものの、なかなかそれらしいものは見つからない。
諦めて、やはりffmpegで見るしかないのか、、、と思ったがある事に気がついた。
ffmpegで入力ファイルだけ引数に与えたらどうなるだろう。。。
つーわけで、次みたいに端末を叩いてみた。
$ ffmpeg -i smile.mp4
FFmpeg version SVN-rUNKNOWN, Copyright (c) 2000-2007 Fabrice Bellard, et al.
configuration: --enable-gpl --enable-pp --enable-swscaler --enable-pthreads --enable-libvorbis --enable-libtheora --enable-libogg --enable-libgsm --enable-dc1394 --disable-debug --enable-libmp3lame --enable-libfaadbin --enable-libfaad --enable-libfaac --enable-xvid --enable-x264 --enable-liba52 --enable-amr_nb --enable-amr_wb --enable-shared --prefix=/usr
libavutil version: 1d.49.3.0
libavcodec version: 1d.51.38.0
libavformat version: 1d.51.10.0
built on Jul 16 2008 19:54:40, gcc: 4.2.3 (Ubuntu 4.2.3-2ubuntu7)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'smile.mp4':
Duration: 00:13:54.1, start: 0.000000, bitrate: 204 kb/s
Stream #0.0(und): Video: h264, yuv420p, 512x384, 60.00 fps(r)
Stream #0.1(und): Audio: aac, 44100 Hz, stereo
Must supply at least one output file
$
smile.mp4はニコ動から落としてきた適当なファイル。
余計なものも表示されてしまったが、最後のほうでしっかり知りたかった情報が表示されている。
とりあえず、目的は達成したけど。。。なんか納得できない。
登録:
投稿 (Atom)