1.get 最新ffmpeg源码
ffmpeg.org中
git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg
2.编译成android识别的库
配置编译脚本
config.sh
#!/bin/bash
NDK=/home/lls/4.0.4/android-ndk-20150811
SYSROOT=$NDK/platforms/android-9/arch-mips/
TOOLCHAIN=$NDK/toolchains/mipsel-linux-android-4.6/prebuilt/linux-x86
CPU=loongson
PREFIX=$(pwd)/android/$CPU
./configure \
--prefix=$PREFIX \
--cpu=loongson3 \
--enable-shared \
--disable-static \
--disable-doc \
--disable-asm \
--disable-ffserver \
--cross-prefix=$TOOLCHAIN/bin/mipsel-linux-android- \
--cc=$TOOLCHAIN/bin/mipsel-linux-android-gcc \
--as=$TOOLCHAIN/bin/mipsel-linux-android-as \
--enable-cross-compile \
--nm=$TOOLCHAIN/bin/mipsel-linux-android-nm \
--target-os=linux \
--extra-cflags="-fPIC -DANDROID" \
--arch=mips \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic" \
修改configure文件
diff --git a/configure b/configure
index 124b87f..3d85941 100755
--- a/configure
+++ b/configure
@@ -2929,10 +2929,15 @@ SLIBPREF="lib"
SLIBSUF=".so"
SLIBNAME='$(SLIBPREF)$(FULLNAME)$(SLIBSUF)'
SLIBNAME_WITH_VERSION='$(SLIBNAME).$(LIBVERSION)'
-SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
-LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
-SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
-SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
+#SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
+#LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
+#SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
+#SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
+
+SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
+LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
+SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
+SLIB_INSTALL_LINKS='$(SLIBNAME)'
asflags_filter=echo
经过修改就可以编译出需要的库文件,
libavcodec-56.so libavdevice-56.so libavfilter-5.so libavformat-56.so libavutil-54.so libswresample-1.so libswscale-3.so
3.移植开源播放器
下载
https://github.com/havlenapetr/FFMpeg.git
4.修改移植过程的错误
注意加载动态库顺序,在FFMpeg.java中
"jniaudio", // used for access to android native AudioTrack class
"jnivideo",
"avutil-54",
"swresample-1",
"avcodec-56",
"avformat-56",
"swscale-3",
"avfilter-5",
"avdevice-56",
"ffmpeg_jni"
注释掉FFMpeg.java中与播放过程无关的一些函数设置,只留下av_register_all,avcodec_register_all等native接口,同样,对于jni/jni/com_media_ffmpeg_FFMpeg.c文件,也要修改,取消那些未使用的native方法的定义
(1)modify output.cpp file
Undefined reference to AndroidSurface_updateSurface(),原因如下,需要进行修改
函数在frameworks/base/native/video/jni/surface.cpp中没有参数
call the AndroidSurface_updateSurface(),without any parameter,so modify the called funtion in include/android/surface.h
(2)can not find sws_scale funtion in mediaplayer.cpp
modify the Android.mk in jni and libmediaplayer to add swscale lib load
5.调试 apk
使用adb进行调试
参考
http://blog.youkuaiyun.com/gobitan/article/details/22750719
http://blog.youkuaiyun.com/vblittleboy/article/details/21027527
http://blog.youkuaiyun.com/conowen/article/details/7526398
http://blog.youkuaiyun.com/conowen/article/details/7875080