前言

前述博文《基于FFmpeg和Android的音视频同步播放实现》中,我们按照自己的方法实现了一个简单的媒体播放器,并做了音视频同步。但是这个程序在播放更多码流时,遇到了一些问题,包括视频解码问题,同步时视频卡顿等。我们在博文《在ubuntu16.04下测试ffplay程序》中也测试过ffplay这个强大的播放器,而我们也知道SDL基于Android平台也有支持,所以我们可以将ffplay和sdl移植到Android平台上来。

主要工作

  1. 编译FFmpeg的Android平台动态库,以实现视频解码;
  2. 编译SDL2的Android平台动态库,以支持对视频显示和音频播放的芯片支持;
  3. 移植ffplay程序到Android平台,以实现一个基本的媒体播放器;
    FFmpeg和ffplay都在native层实现或编译,SDL2一部分在native层编译,另一部分平台依赖需要在java层实现,当然,SDL2均提供了参考代码。

源代码版本

FFmpeg基于当前最新的4.0.1版本;
SDL2基于当前最新的SDL2-2.0.8版本;
ffplay也是基于FFmpeg4.0.1附带的源码;

编译libffmpeg.so

FFmpeg库的编译基于android-ndk-r14b在Ubuntu下编译,注意采用standalone_toolchain的编译链,可以参考https://blog.csdn.net/ericbar/article/details/80229592 , ndk采用r14b而没有采用最新的版本,因为从r15b版本开始,FFmpeg代码中引用stderr等标准输入输出函数会找不到。
config.sh和make.sh需要做些修改,分别参考如下,

#!/bin/bash

FFMPEG_SRC_PATH=$(cd `dirname $0`; pwd)SYSROOT=/home/ffmpeg/work/toolchain/android/linux-x86_64/ndk-r14/android-19/arm/sysroot
LIBPATH=/home/ffmpeg/work/toolchain/android/linux-x86_64/ndk-r14/android-19/arm/sysroot/usr/lib
TOOLCHAIN=/home/ffmpeg/work/toolchain/android/linux-x86_64/ndk-r14/android-19/armexport PATH=$TOOLCHAIN/bin:$PATH
export CROSS_PREFIX=arm-linux-androideabi-
export CC="${CROSS_PREFIX}gcc "
export CXX=${CROSS_PREFIX}g++
export LD=${CROSS_PREFIX}ld
export AR=${CROSS_PREFIX}ar
export STRIP=${CROSS_PREFIX}stripLDFLAGS="-lm -lz -Wl,-soname=libffmpeg.so,-z,noexecstack"PREFIX=ffout
ADDI_CFLAGS="-marm"echo " "
echo "please wait..."
echo " "#cd $FFMPEG_SRC_PATH
rm ./$PREFIX -rf
make cleanecho " "
echo "preparing to configure..."
echo " "./configure \--prefix=$PREFIX \--enable-shared \--disable-static \--disable-doc \--disable-ffmpeg \--disable-ffprobe \--disable-doc \--disable-symver \--disable-programs \--disable-w32threads \--disable-os2threads \--disable-sdl2 \--tempprefix=$FFMPEG_SRC_PATH \--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \--target-os=linux  \--arch=arm \--enable-cross-compile \--sysroot=$SYSROOT \--extra-cflags="-Os -fpic $ADDI_CFLAGS" \--extra-ldflags="$ADDI_LDFLAGS" \$ADDITIONAL_CONFIGURE_FLAG#   --sysinclude=$SYSROOT \

下面make.sh里,需要把avdevice下的.o库链接添加进来,

#!/bin/bash

FFMPEG_SRC_PATH=$(cd `dirname $0`; pwd)SYSROOT=/home/ffmpeg/work/toolchain/android/linux-x86_64/ndk-r14/android-19/arm/sysroot
LIBPATH=/home/ffmpeg/work/toolchain/android/linux-x86_64/ndk-r14/android-19/arm/sysroot/usr/lib
TOOLCHAIN=/home/ffmpeg/work/toolchain/android/linux-x86_64/ndk-r14/android-19/armexport TMPDIR=$FFMPEG_SRC_PATH
export PATH=$TOOLCHAIN/bin:$PATH
export CROSS_PREFIX=arm-linux-androideabi-
export CC="$CCACHE ${CROSS_PREFIX}gcc "
export CXX=${CROSS_PREFIX}g++
export LD=${CROSS_PREFIX}ld
export AR=${CROSS_PREFIX}ar
export STRIP=${CROSS_PREFIX}stripLDFLAGS="-lm -lz -Wl,-soname=libffmpeg.so,-z,noexecstack"CPU=arm
PREFIX=ffout
ADDI_CFLAGS="-marm"#make -j${NUMBER_OF_CORES} && make install || exit 1
make -j4 && make install || exit 1rm  libavcodec/reverse.o libavcodec/log2_tab.o libavformat/log2_tab.o libavformat/golomb_tab.o \libswresample/log2_tab.o libavfilter/log2_tab.o libswscale/log2_tab.o libavdevice/reverse.o$CC -o $PREFIX/libffmpeg.so -shared $LDFLAGS $EXTRA_LDFLAGS --sysroot=$SYSROOT -L $LIBPATH \libavutil/*.o libavutil/arm/*.o libavcodec/*.o libavcodec/arm/*.o  \libavformat/*.o libavfilter/*.o libswresample/*.o libswresample/arm/*.o \libswscale/*.o libswscale/arm/*.o compat/*.o libavdevice/*.ocp $PREFIX/libffmpeg.so $PREFIX/libffmpeg-debug.so
${STRIP} --strip-unneeded $PREFIX/libffmpeg.so

编译SDL2库

我们下载SDL2-2.0.8源码后,解压缩,直接进入SDL2-2.0.8目录,首先需要设置NDK的环境变量,这里注意NDK不要采用类似FFmpeg编译的standalone_toolchain方式,采用从Google官网下载的原始版本解压缩即可,版本的话,使用android-ndk-r16b即可,参考下述命令即可启动编译,

export ANDROID_NDK_HOME=/home/ffmpeg/work/android-ndk-r16b
export PATH=$ANDROID_NDK_HOME:$PATH
ndk-build -B NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=Android.mk

最后在SDL2-2.0.8\libs\armeabi-v7a下会生成libSDL2.so库。

移植ffplay

ffplay程序基于eclipse来编译,其中eclipse的ndk版本采用android-ndk-r13b;主要是一些头文件依赖和编译警告,需要做一些适当的调整和修正。

SDL2的java层适配

SDL2的源码里提供了相关参考,我们直接搬过来就行,代码路径位于,
SDL2-2.0.8\android-project\app\src\main\java\org\libsdl\app
当然,我们需要做一点修改,主要有如下几点:
1. SDLActivity.java中,主程序(main函数)所在的so库名是libfflay.so而不是libmain.so,这个是我在创建工程时选的so名字,所以要修改过来,大家可以根据自己实际名字修改。
2. SDLActivity.java中,加载的so库,由main修改成ffmpeg和ffplay;
3. SDLActivity.java中,native层启动的主程序名由SDL_main改成start,注意我们这里把ffplay源码里的main函数改成了start函数;

GitHub源码

代码修改部分比较琐碎,这里不一一讲述,媒体播放url在ffplay.c的input_filename全局变量初始化时直接赋值。

请参考完整的源码路径:
https://github.com/ericbars/ffplay

移植ffplay媒体播放器和sdl2到Android平台相关推荐

  1. android百度播放器,终结媒体播放器 百度推新Android浏览器

    [PConline资讯]昨夜晚间,有消息称百度推出一款新的Android系统移动浏览器,该款移动浏览器最大的功能特色就是使得用户能够在没有安装媒体播放器的前提下播放视频,支持网页游戏,大幅度提高上网速 ...

  2. android媒体播放器课程设计,基于Android的多媒体播放器课程设计报告

    基于Android的多媒体播放器课程设计报告 p/*/pp源代码. 我希望这篇文章对初学者有帮助. 希望更多的人在网络上共享自己的学习成果./pp*/pp1 .开发环境/ppAndroid是基于Lin ...

  3. android媒体播放器设计报告,基于Android的多媒體播放器课程设计报告.doc

    基于Android的多媒體播放器课程设计报告 基于Android的多媒体播放器课程设计报告 (2014-01-02 22:46:52) HYPERLINK "javascript:;&quo ...

  4. android媒体播放器课程设计,基于android的多媒体播放器课程设计报告.doc

    基于android的多媒体播放器课程设计报告.doc /* 附源码.希望此文能帮助到一些新手.也希望更多的人在网络上 分享自己的学习成果.互相交流,扣扣70876398 */ 1. 开发环境 Andr ...

  5. android媒体播放器课程设计,基于Android的多媒体播放器课程设计报告 ()

    /* */ 1.开发环境 Android 是一种基于Linux? 内核的综合操作环境.最初,Android 的部署目标是移动电话领域,包括智能电话和更廉价的翻盖手机.Android 全面的计算服务和丰 ...

  6. upnp 播放器 android,基于Android系统的UPNP媒体播放器的研究与实现

    摘要: 近几年来,"数字家庭网络"的发展备受人们的关注,如何通过有线或无线的方式将多个网络设备及家庭设备互联互通,最终实现设备之间自动发现.智能互联.相互控制.资源共享等操作,是目 ...

  7. 基于QT平台的手持媒体播放器项目实战视频教程下载

    分享一套关于在QT平台的手持媒体播放器项目实战的视频教程,Qt是一个1991年由奇趣科技开发的跨平台C++图形用户界面应用程序开发框架. 它既可以开发GUI程式,也可用于开发非GUI程式,比如控制台工 ...

  8. 小戴媒体播放器 2.0.2

    小戴媒体播放器  2.0.2 是一个开源软件,全媒体,包括视频,音频,跨平台(WindowsXP/Vista/7,Ubuntu).   解压ffmpeg-3.1.5.tar到某个目录, 然后用这里的源 ...

  9. 浅谈Linux下的媒体播放器(转)

    浅谈Linux下的媒体播放器(转)[@more@]Linux开放实验室(Linux OpenLab)郝煜.季冰Linux开放实验室校园爱好者小组 陈强(农大).吴迪.雷凌.戴二红.刘志强(北科大)Li ...

最新文章

  1. Day 3: Flask —— 使用Python和OpenShift进行即时Web开发
  2. ToString() 会发生装箱吗?
  3. creator找不到编译器 qt_VS2017直接使用QT库创建程序
  4. 福建职称计算机评聘任,职称聘任工作的有关补充规定(试行)
  5. C++ —— C++类
  6. c语言数码管的动态显示时间,8位数码管动态显示时间,可调节,调节的数闪烁显示...
  7. ASP游戏工作室网站源码v1.0
  8. tcp协议之三次握手,四次挥手
  9. 事务隔离级别和传播行为_.spring的事务有几种方式?spring事务的隔离级别和传播行为是什么?...
  10. VDA2 6th 2020 Securing the Quality of Supplies PPA 最新版 第6版 供货质量保证:生产过程和产品批准PPA(红皮书)
  11. 电脑计算机为什么不是有效程序,电脑提示“不是有效的win32应用程序”是什么原因【解决方法】...
  12. Halcon union_straight_contours_xld详解
  13. 代码读智识  笔墨知人心
  14. 手机号归属地,在线查询api
  15. continue 当条件不问那么执行你所对比的这个参数
  16. 《剑指offter》第十九题(js)
  17. euraka注册中心配置步骤(Maven工程导入)
  18. 2014-Unity3d基础入门到高级全套全系列视频教程
  19. 51单片机简易电阻电感电容RLC测量仪仿真设计
  20. 发现同义词 python_python如何识别单词的同义词和反义词

热门文章

  1. 联合国 ITU 立项成功,DevOps 标准开启国际化模式!
  2. 还在为这部现象级大片热血沸腾?不如来游戏里亲身感受
  3. 五十一个经典小故事2
  4. 国庆假期欣赏机械之美
  5. 神经网络的图像识别技术,神经网络图像角度分析
  6. 哨兵2a 波段组合_基于Sentinel-2(哨兵2)遥感卫星的植被覆盖度提取
  7. 如何播放html文件类型,m3u8格式如何播放
  8. ROM,PROM,EPROM,EEPROM及FLASH存储器的区别
  9. 阿里插件机制android,Android插件 - 阿里規約 Alibaba Java Coding Guidelines
  10. 微软 Github AI 编程工具 Copilot 正式上线,学生免费使用