質問: 現在ローカルPCにはGnuTLSとx264を付けてmakeしたffmpegがインストールされております。 ``` % ffmpeg -version ffmpeg version 2.5.3 Copyright (c) 2000-2015 the FFmpeg developers built on Jan 23 2015 09:43:11 with Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn) configuration: --prefix=/Volumes/ffmpeg_gnutls/sw --libdir=/Volumes/ffmpeg_gnutls/sw/lib --enable-gpl --enable-nonfree --enable-libfaac --enable-pthreads --enable-libmp3lame --enable-libvorbis --enable-gnutls --enable-libx264 --pkg-config-flags=--static --disable-shared --enable-static --arch=x86_64 libavutil 54. 15.100 / 54. 15.100 libavcodec 56. 13.100 / 56. 13.100 libavformat 56. 15.102 / 56. 15.102 libavdevice 56. 3.100 / 56. 3.100 libavfilter 5. 2.103 / 5. 2.103 libswscale 3. 1.101 / 3. 1.101 libswresample 1. 1.100 / 1. 1.100 libpostproc 53. 3.100 / 53. 3.100 ``` しかしHeroku上に同じものをインストールさせたいと思った場合 (同じものでなくても期待する動作ができれば構いませんが) ``` https://github.com/shunjikonishi/heroku-buildpack-ffmpeg https://github.com/HYPERHYPER/heroku-buildpack-ffmpeg ``` これらのbuildpackを使わせていただくと、libtheoraやlibvorbisは入っておりますがGnuTLSやx264は入っておりません。 普通にherokuにインストールしたところこのような感じです。 ``` % heroku run "ffmpeg -version" Running `ffmpeg -version` attached to terminal... up, run.8784 ffmpeg version 2.5.2 Copyright (c) 2000-2014 the FFmpeg developers built on Jan 14 2015 21:42:21 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1) configuration: --enable-libtheora --enable-libvorbis --prefix=/app/vendor/ffmpeg libavutil 54. 15.100 / 54. 15.100 libavcodec 56. 13.100 / 56. 13.100 libavformat 56. 15.102 / 56. 15.102 libavdevice 56. 3.100 / 56. 3.100 libavfilter 5. 2.103 / 5. 2.103 libswscale 3. 1.101 / 3. 1.101 libswresample 1. 1.100 / 1. 1.100 ``` 自分がローカルでmakeしたffmpegをtaz.gzに圧縮してネット上にアップロードしてそちらを使うようにしてみたのですが、 エラーは起きず無事にデプロイは終わるものの `heroku run ffmpeg -version` で確認してもffmpeg自体がインストールされておりませんでした。 フォルダの構成はbin,include,lib,shareと同じにはなっているのですが、中身はかなり違います。 他の方はどのようにしてHerokuでffmpegを利用されているのでしょうか? なお、この質問に至った経緯としましては、ローカルでは問題なく行われていたエンコードが、 Heroku上だと音声のみで映像の無いmp4ファイルが出来上がってしまうため、 表題の違いが原因なのではないかと思った次第です。 ここまで読んでいただきありがとうございます。 --- (2/3追記) ありがとうございます。 > > 「ローカルの ffmpeg をネット上に」をもう少し詳しく書いてください。 > > 1ローカルの OSX で作った ffmpeg ですか? Linux 環境で作った ffmpeg ですか? > > > ローカルのOSXで作ったffmpegです。 作り方はほぼ @riocampos さんが書いてくださった GnuTLSライブラリを使ったスタティックなFFmpegの作り方@Mac - 別館 子子子子子子(ねこのここねこ) の通りです。 ほぼと書いたのは、これにlibx264を加えているからです。 ``` http://download.videolan.org/x264/snapshots/ ``` の `last_stable_x264.tar.bz2` です。 それ以外は全く同じ方法で作りました。 最終的なmakeコマンドは ``` % ./configure --prefix=${TARGET} --libdir=${TARGET}/lib --enable-gpl --enable-nonfree --enable-libfaac --enable-pthreads --enable-libmp3lame --enable-libvorbis --enable-gnutls --enable-libx264 --pkg-config-flags=--static --disable-shared --enable-static --arch=x86_64 && make -j 4 && make install ``` となります。 > > 2ネットとは? heroku 以外ですよね? > > > はい、S3です。 DLは問題なく行えます。 heroku push時にエラーメッセージや警告もありません。 --- (2/4追記) ありがとうございます、Vulcan、Anvilは可能性ありそうですね。 使ってみましたが、今の所私ではうまくいきませんでした。 VPSでやるべきか、それとも Ubuntuでmakeすればいけるのか?などとも考えておりました。 GnuTLS、OpenSSLが使えるものが中々見当たらないのですが、 x264だけならbuildpackがいくつかあるようです。 buildpackのforkの中に、素晴らしいものがありました。 ``` https://github.com/markaschneider/heroku-buildpack-ruby-ffmpeg-sox ``` このbuildpackを使わさせていただいた結果が、以下になります ``` % heroku run "ffmpeg -version" Running `ffmpeg -version` attached to terminal... up, run.3469 ffmpeg version N-51358-ge234daa built on Mar 28 2013 05:11:41 with gcc 4.6 (Debian 4.6.3-1) configuration: --prefix=/root/ffmpeg-static/32bit --arch=x86_32 --extra-cflags='-m32 -I/root/ffmpeg-static/32bit/include -static' --extra-ldflags='-m32 -L/root/ffmpeg-static/32bit/lib -static' --extra-libs='-lxml2 -lexpat -lfreetype' --enable-static --disable-shared --disable-ffserver --disable-doc --enable-bzlib --enable-zlib --enable-postproc --enable-runtime-cpudetect --enable-libx264 --enable-gpl --enable-libtheora --enable-libvorbis --enable-libmp3lame --enable-gray --enable-libass --enable-libfreetype --enable-libopenjpeg --enable-libspeex --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-version3 --enable-libvpx libavutil 52. 22.101 / 52. 22.101 libavcodec 55. 2.100 / 55. 2.100 libavformat 55. 0.100 / 55. 0.100 libavdevice 55. 0.100 / 55. 0.100 libavfilter 3. 48.105 / 3. 48.105 libswscale 2. 2.100 / 2. 2.100 libswresample 0. 17.102 / 0. 17.102 libpostproc 52. 2.100 / 52. 2.100 ``` --enable-libx264が入っています。このffmpegを用いて動画と音声も問題なくエンコードされました。 短期間で答えが出る保証がありませんので一旦返答させていただきます。 よりよい回答がありましたらまた加筆いたします。
回答: heroku は Mac で動作しているわけではないので、ローカルで作成された ffmpeg バイナリは動かないはずです。 で、 heroku で動作するバイナリを作る方法を検索してみたところ、 * Herokuにバイナリを組み込むbuildpackを作成する - フレクトのHeroku Lab という記事が見つかりました。しかも ffmpeg のビルドをしています。 概要としては * Vulcan という heroku 上で動くビルドサーバを使う * heroku でビルドする * できたバイナリをどこかへ置く となるようです。 気になるのは、 > > Vulcan [DEPRECATED] > > A build server in the cloud. > > NOTE: The Vulcan build service is no longer maintained or supported, and it's no longer recommended for building binaries. Use heroku run instead. > > > * heroku/vulcan/README.md と書いてあったことです。つまり、もう古い、と。 Vulcan 以外のビルド手段としては * heroku-anvil というのがあるようです。中で Anvil というビルドサーバが動作しており、 `heroku build` というコマンドでビルドができるようになる、みたいです。 いずれにせよ、 GnuTLS と x264 とを組み込むには、やはりそれぞれのライブラリを heroku 上でコンパイルする必要があると思うのですが、そのやり方までは分からないです。 もし上手く行けば、私も知りたいので、追記をお願いします(人任せで申し訳ないです)。