原文 http://blog.csdn.net/wscem/article/details/7698634 linux
havlenapetr的项目使用的是ffmpeg 0.81版本,ndk用的早期的版本ndk_1.6_r1,用ndk_r7编译通不过,用ndk_r5或者r8却能经过 android
首先编译ffmpeg,最好是在纯linux环境下编译,window下用cygwin会出莫名其妙的问题 shell
1.configure ffmpeg 缓存
新建config.sh文件,内容以下(针对armv7-acpu优化过的,--enable-runtime-cpudetect 是开启全部的cpu支持,enable参数都是能够随便改的) ide
#!/bin/sh PREBUILT=/usr/local/android-ndk-r8/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86 PLATFORMS=/usr/local/android-ndk-r8/platforms/android-9/arch-arm ./configure --target-os=linux \ --arch=arm \ --cpu=armv7-a \ --disable-yasm \ --disable-asm \ --enable-gpl \ --enable-version3 \ --enable-nonfree \ --enable-cross-compile \ --enable-runtime-cpudetect \ --cc=$PREBUILT/bin/arm-linux-androideabi-gcc \ --cross-prefix=$PREBUILT/bin/arm-linux-androideabi- \ --nm=$PREBUILT/bin/arm-linux-androideabi-nm \ --extra-cflags="-fPIC -DANDROID -mfpu=neon -mfloat-abi=softfp " \ --enable-static \ --disable-shared \ --prefix=/home/wangsc/android_ffmpeg_sndu \ --extra-ldflags="-Wl,-T,$PREBUILT/arm-linux-androideabi/lib/ldscripts/armelf_linux_eabi.x -Wl,-rpath-link=$PLATFORMS/usr/lib -L$PLATFORMS/usr/lib -nostdlib $PREBUILT/lib/gcc/arm-linux-androideabi/4.4.3/armv7-a/crtbegin.o $PREBUILT/lib/gcc/arm-linux-androideabi/4.4.3/armv7-a/crtend.o -lc -lm -ldl"
而后修改生成的config.h文件 函数
#define restrict restrict post
改成 #define restrict (ndk-build不支持restrict关键字,因此删除后面的一个restrict) 优化
#define HAVE_SYS_RESOURCE_H 0 ui
改成 #define HAVE_SYS_RESOURCE_H 1 idea
#define CONFIG_AVDEVICE 1
改为
#define CONFIG_AVDEVICE 0
修改jni/Android.mk 静态库增长libavfliter
LOCAL_STATIC_LIBRARIES := libavcodec libavformat libavutil libpostproc libswscale libmediaplayer
改为
LOCAL_STATIC_LIBRARIES := libavformat libavcodec libavfilter libavutil libpostproc libswscale libmediaplayer
而后转到havlenapetr 项目的根目录执行ndk-build就能够编译成功了(注意ndk版本要是r5或r8)
因为havlenapetr自带的libaudio和libvideo库是在android 2.2系统中编译出来的 , 因此编译成功的库只能在2.2系统上运行,若要在其余系统上运行,还须要在相应的系统源码树种编译这两个文件。 这两个是调用系统输出视频与音频的库,2.2和2.3的源码改动挺大的。因此互不支持。
源文件能够再havlenapetr之前的工程中找到,,(忘记在什么地方了~~~~(>_<)~~~~ )
音视频不一样步问题:
同步通常有三种方法:音频同步视频,视频同步音频,音视频外部时钟同步
这里用的视频同步音频,
在音视频解码的线程中分别添加获取时间戳的函数,解码视频的时候调用音频解码线程中的该函数,获得当前音频的时间戳,与当前的视频时间戳比较,而后使用pthread->wait线程休眠。
播放暂停:
havlenapetr的工程中使用了5个线程,每一个线程都有独立的缓存,分别是 读取媒体流、音频解码、音频播放、视频解码、视频播放,暂停功能须要将全部的线程都休眠掉,
画面倾斜:
mediaplayer添加一个OnVideoSizeChangedListener,,改变surfaceView的大小,setFixSize(width,height);
快进快退:
av_seek_frame() 传入要跳转的位置。
记得清空播放线程的缓存,要否则还会继续播放几秒钟。
播放进度:
这个用时间戳就能够了
(时间戳是微秒级别的,进度条是毫秒级别的)