havlenapetr,ffmpeg 播放器 编译、以及bug修改

havlenapetr的项目使用的是ffmpeg 0.81版本,ndk用的早期的版本ndk_1.6_r1,用ndk_r7编译通不过,用ndk_r5或者r8却能通过

首先编译ffmpeg,最好是在纯linux环境下编译,window下用cygwin会出莫名其妙的问题

1.configure ffmpeg

新建config.sh文件,内容如下(针对armv7-acpu优化过的,--enable-runtime-cpudetect 是开启所有的cpu支持,enable参数都是可以随便改的)

#!/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

改为 #define restrict (ndk-build不支持restrict关键字,所以删除后面的一个restrict)

#define HAVE_SYS_RESOURCE_H 0

改为 #define HAVE_SYS_RESOURCE_H 1

#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() 传入要跳转的位置。

记得清空播放线程的缓存,要不然还会继续播放几秒钟。

播放进度:

这个用时间戳就可以了

(时间戳是微秒级别的,进度条是毫秒级别的)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值