で説明したコードと方法を使用して、Android用のffmpegをビルドしました。
https://github.com/halfninja/android-ffmpeg-x264
Windows上のVirtualBoxで実行しているUbuntuを使用する。次に、libvideokit.soを、提供されているプロジェクトのWindowsコピーのProject \ libs \ armeabiフォルダーにコピーしました。そこから私は自分のAndroidデバイスでEclipseからProjectTestを実行することができました。 ffmpegコードが実行されているのを見ることができますが、それが入力ファイルを開く時点に到達すると、指示されたエラーを出します。私はこの問題についていくつかの議論に気づきました
Android上のFFMpeg、libavcodec関数への未定義の参照、ただしコマンドラインにリストされています
しかし、このビルドではファイルプロトコルが有効になっているので解決策は役に立ちませんでした。また、ファイルパスの前に "file:"を付けて試してみました。完全を期すために、すべてのデフォルトを有効にするためにminimal_featureset = 0を設定しようとしましたが、これによって同じエラーが発生します。以下はEclipseからのlogcatのスナップショットで、Videokitからの出力とLOGEへの追加呼び出しを使ってav_open_input_fileからの結果を表示しています。試してみるものの提案は大歓迎です。
10-23 11:57:33.888: DEBUG/Videokit(4830): run() called
10-23 11:57:33.888: DEBUG/Videokit(4830): run passing off to main()
10-23 11:57:33.904: DEBUG/Videokit(4830): main(): registering all modules
10-23 11:57:33.927: DEBUG/Videokit(4830): main(): registered everything
10-23 11:57:33.927: DEBUG/Videokit(4830): main(): initting opts
10-23 11:57:33.943: DEBUG/Videokit(4830): main(): initted opts.
10-23 11:57:33.943: ERROR/Videokit(4830): ffmpeg version N-30996-gf925b24, Copyright (c) 2000-2011 the FFmpeg developers
10-23 11:57:33.943: ERROR/Videokit(4830): built on Oct 21 2011 13:54:03 with gcc 4.4.3
10-23 11:57:33.943: ERROR/Videokit(4830): configuration: --enable-cross-compile --arch=arm5te --enable-armv5te --target-os=linux --disable-stripping --prefix=../output --disable-neon --enable-version3 --disable-shared --enable-static --enable-gpl --enable-memalign-hack --cc=arm-linux-androideabi-gcc --ld=arm-linux-androideabi-ld --extra-cflags='-fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated' --disable-everything --enable-decoder=mjpeg --enable-demuxer=mjpeg --enable-parser=mjpeg --enable-demuxer=image2 --enable-muxer=mp4 --enable-encoder=libx264 --enable-libx264 --enable-decoder=rawvideo --enable-protocol=file --enable-hwaccels --disable-ffmpeg --disable-ffplay --disable-ffprobe --disable-ffserver --disable-network --enable-filter=buffer --enable-filter=buffersink --disable-demuxer=v4l --disable-demuxer=v4l2 --disable-indev=v4l --disable-indev=v4l2 --extra-cflags='-I../x264 -Ivideokit' --extra-ldflags=-L../x264
10-23 11:57:33.943: DEBUG/Videokit(4830): main(): parsing options
10-23 11:57:33.943: DEBUG/Videokit(4830): parse_options has 4 options to parse
10-23 11:57:33.951: ERROR/Videokit(4830): opt_input_file av_open_input_file /mnt/sdcard/fun/snap0000.jpg -2
10-23 11:57:33.951: ERROR/Videokit(4830): /mnt/sdcard/fun/snap0000.jpg: No such file or directory
10-23 11:57:33.951: ERROR/Videokit(4830): ffmpeg_exit(1) called!
問題は権限にあります。アンドロイドで我々は所有者としてシステムでマウントされているが、rwxなしでSDカードを持っています。しかしffmpegはそれをチェックします。
avformat / file.c:
static int file_check(URLContext *h, int mask)
{
struct stat st;
int ret = stat(h->filename, &st);
if (ret < 0)
return AVERROR(errno);
ret |= st.st_mode&S_IRUSR ? mask&AVIO_FLAG_READ : 0;
ret |= st.st_mode&S_IWUSR ? mask&AVIO_FLAG_WRITE : 0;
return ret;
}
この機能を次のように変更してください。
static int file_check(URLContext *h, int mask)
{
struct stat st;
int ret = stat(h->filename, &st);
if (ret < 0)
return AVERROR(errno);
ret |= st.st_mode&S_IRUSR ? mask&AVIO_FLAG_READ : 0;
ret |= st.st_mode&S_IRGRP ? mask&AVIO_FLAG_READ : 0;
ret |= st.st_mode&S_IROTH ? mask&AVIO_FLAG_READ : 0;
ret |= st.st_mode&S_IWUSR ? mask&AVIO_FLAG_WRITE : 0;
ret |= st.st_mode&S_IWGRP ? mask&AVIO_FLAG_WRITE : 0;
ret |= st.st_mode&S_IWOTH ? mask&AVIO_FLAG_WRITE : 0;
return ret;
}
そしてffmpegを再構築してください。そしてそれはそれだ!
実際、私はこのバージョンでFFMpegをコンパイルしている間同じ問題を抱えています:http://www.roman10.net/?p=389
そして、すべて有効にすることができます(--disable-everythingオプションを取り除きます)。
何かアイデアがあれば、興味があります:)
編集する
HalfNinjaサイトでは、これが書かれているものです:
「...現時点では、入力ファイルに問題があります(ほとんどの入力は問題ないと思いますが、JPEGシーケンスは認識されません)」
:(