【问题标题】:AMR-NB support in javacv -> ffmpegjavacv 中的 AMR-NB 支持 -> ffmpeg
【发布时间】:2013-12-17 08:46:25
【问题描述】:

我正在尝试在 JavaCV Android 中使用 AMR_NB 编解码器但遇到问题:

这是我运行的代码:

avcodec.avcodec_register_all();
avformat.av_register_all();
AVCodec mCodec = avcodec.avcodec_find_encoder(avcodec.AV_CODEC_ID_AMR_NB);

输出:mCodec 为空,但如果我通过 avcodec.AV_CODEC_ID_AAC 比 mCodec 不为空

我假设我必须使用 --enable-libopencore-amrnb 重新编译 ffmpeg。因此,我下载了 Android NDKr9+ffmpeg-2.0.2+last_stable_x264 并将它们添加到 javacv-cppjars 文件夹中,我还在 /usr/local 中安装了 opencore-amr 库。在 ffmpeg-2.0.2-android-arm.patch 我添加了 --enable-libopencore-amrnb 标志并在终端中运行以下命令

ANDROID_NDK=/Users/android-ndk-r9b/ FFMPEG_VERSION=2.0.2 ./build_ffmpeg-android-arm.sh

脚本运行但未生成库且 jar 为空但如果我删除 --enable-libopencore-amrnb 标志,则库已成功生成,请告知我做错了什么?我该怎么办?任何帮助将不胜感激!

顺便说一下,我用的是mac-osx

谢谢。

【问题讨论】:

  • 仅供参考:在 JavaCV 脚本中,在您的脚本中禁用-gpl 和 libx264。否则你将违反 GPL。
  • 谢谢@Edison 我知道了,这个项目只是为了学习!

标签: android android-ndk ffmpeg javacv


【解决方案1】:

我假设 build_ffmpeg-android-arm.sh 是this,如果是这种情况,要正确使用 --enable-libopencore-amrnb 你还需要提供 opencore-amr 库(opencore 源不包含在ffmpeg 代码),否则configure 会抱怨找不到 opencore 库。

为了修复它,您需要:

  1. 从here 下载opencore-amr 源代码并将其复制到javacv-cppjars 文件夹中。
  2. 修改 build_ffmpeg-android-arm.sh 以构建和链接 opencore 的库:

ANDROID_BIN=$ANDROID_NDK/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/    
ANDROID_ROOT=$ANDROID_NDK/platforms/android-9/arch-arm/
tar -xjvf ffmpeg-$FFMPEG_VERSION.tar.bz2
mv ffmpeg-$FFMPEG_VERSION ffmpeg-$FFMPEG_VERSION-android-arm
cd ffmpeg-$FFMPEG_VERSION-android-arm
tar -xjvf ../last_stable_x264.tar.bz2
X264=`echo x264-snapshot-*`
cd $X264
./configure --enable-static --enable-pic --disable-cli --cross-prefix=$ANDROID_BIN/arm-linux-androideabi- --sysroot=$ANDROID_ROOT --host=arm-linux --extra-cflags="-DANDROID -fPIC -ffunction-sections -funwind-tables -fstack-protector -march=armv7-a -mfloat-abi=softfp -mfpu=vfp -mfpu=neon -fomit-frame-pointer -fstrict-aliasing -funswitch-loops -finline-limit=300" --extra-ldflags="-nostdlib -Wl,--fix-cortex-a8 -lgcc -ldl -lz -lm -lc"
make -j4
cd ../

tar -xzf ../opencore-amr-0.1.3.tar.gz
cd opencore-amr-0.1.3
BUILD_FLAGS="--sysroot=$ANDROID_NDK/platforms/android-9/arch-arm"
CFLAGS="$BUILD_FLAGS" CXXFLAGS="$BUILD_FLAGS" CPPFLAGS="$BUILD_FLAGS" RANLIB=$ANDROID_BIN/arm-linux-androideabi-ranlib CC=$ANDROID_BIN/arm-linux-androideabi-gcc CXX=$ANDROID_BIN/arm-linux-androideabi-g++ LD=$ANDROID_BIN/arm-linux-androideabi-ld CPP=$ANDROID_BIN/arm-linux-androideabi-cpp LDFLAGS="-L$ANDROID_NDK/platforms/android-9/arch-arm/usr/lib/" ./configure --host=arm-linux-gnu --disable-shared
make
mv amrnb opencore-amrnb
cd ../

patch -p1 < ../ffmpeg-$FFMPEG_VERSION-android-arm.patch
./configure --prefix=$HOME/android --enable-libopencore-amrnb --extra-cflags="-Iopencore-amr-0.1.3" --extra-ldflags="-Lopencore-amr-0.1.3/opencore-amrnb/.libs" --enable-shared --enable-gpl --enable-version3 --enable-runtime-cpudetect --disable-outdev=sdl --enable-libx264 --extra-cflags="-I$X264" --extra-ldflags="-L$X264" --enable-cross-compile --cc=$ANDROID_BIN/arm-linux-androideabi-gcc --sysroot=$ANDROID_ROOT --target-os=linux --arch=arm --extra-cflags="-DANDROID -fPIC -ffunction-sections -funwind-tables -fstack-protector -march=armv7-a -mfloat-abi=softfp -mfpu=vfp -mfpu=neon -fomit-frame-pointer -fstrict-aliasing -funswitch-loops -finline-limit=300" --extra-ldflags="-nostdlib -Wl,--fix-cortex-a8" --extra-libs="-lgcc -ldl -lz -lm -lc" --disable-stripping --disable-symver --disable-programs
make
LIBS="libavcodec/libavcodec.so libavdevice/libavdevice.so libavfilter/libavfilter.so libavformat/libavformat.so libavutil/libavutil.so libpostproc/libpostproc.so libswresample/libswresample.so libswscale/libswscale.so"
$ANDROID_NDK/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-strip $LIBS
mkdir -p com/googlecode/javacv/cpp/android-arm/
cp $LIBS com/googlecode/javacv/cpp/android-arm/
jar cvf ../ffmpeg-$FFMPEG_VERSION-android-arm.jar com/
rm -Rf com/
cd ../

然后重新构建。请注意,构建 opencore 的新部分基于 0.1.3 版本和重命名 amrnb 文件夹的小技巧。

希望这会有所帮助。

【讨论】:

  • 感谢您的回复,我在编译 open core-amrnb 时遇到问题,这里是 script file,这里是 console output,你可以看到 libopencore-amrnb.a 没有内容,请帮忙!顺便说一句,我在 OSX 上会改变什么吗?
  • @cyberpawn 如果您运行的是 OSX,您还需要将 ranlib 指向 android ranlib:RANLIB=$ANDROID_BIN/arm-linux-androideabi-ranlib(Mac 和 Android ranlib 不兼容)。我编辑了添加这个的答案(它可能对其他人有帮助)
  • @cyberpawn 不客气!我很高兴它有帮助。请记住,h264 和 AMR 都有版税,您需要根据您的应用程序最终使用情况重新检查。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-03
  • 1970-01-01
  • 2018-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多