本篇项目地址,求star
https://github.com/979451341/Audio-and-video-learning-materials/tree/master/FFmpeg%E6%92%AD%E6%94%BE%E8%A7%86%E9%A2%91

首先FFmpeg是c语言写的,所以我们需要NDK的技术,然后我使用的NDK使用Cmake的,一开始就是说如何将FFmpeg导入项目,使用我的方法导入FFmpeg不用一分钟。

这个需要大家先在上面的代码地址里下载项目代码
因为FFmpeg这个基于android的so文件如何生成的我不写出来,我也是直接用别人文件,直接使用我项目里的就好了

1.FFmpeg简单的说明

多媒体视频处理工具FFmpeg有非常强大的功能包括视频采集功能、视频格式转换、视频抓图、给视频加水印等。

他的功能有7大部分完整

libavcodec:提供范围更广的编解码器的实现。

libavformat:实现流媒体协议,容器格式和基本的I/O访问。

libavutil:包括校验,解压缩和各种实用功能。

libavfilter:提供了一个平均改变解码音频和视频通过过滤器链。

libavdevice:提供抽象访问捕获和重放设备。

libswresample:实现音频混合和重采样程序。

libswscale:实现颜色转换和缩放程序。

2.环境配置

将下载的项目里jniLibs和cpp粘贴到自己创建的项目的main文件夹下

我还需要在app module的build.gradle添加代码,在defaultConfig里添加ndk支持的类型,还有给Cmake添加参数,在android下导入CMakeLists文件,例子代码如下:

android {compileSdkVersion 26defaultConfig {applicationId "jonesx.videoplayer"minSdkVersion 19targetSdkVersion 26versionCode 1versionName "1.0"testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"ndk {abiFilters 'armeabi'}externalNativeBuild {cmake {arguments '-DANDROID_TOOLCHAIN=clang','-DANDROID_STL=gnustl_static'}}}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}}externalNativeBuild {cmake {path "src/main/cpp/CMakeLists.txt"}}
}

3.代码说明

首先就是能够使用cpp文件夹下的VideoPlayer的代码,那我们就需要创建一个VideoPlayer的java类

public class VideoPlayer {static {System.loadLibrary("VideoPlayer");}public static native int play(Object surface);
}

使用这个play函数,直接在SurfaceView的surfaceCreated函数里开启线程使用

    @Overridepublic void surfaceCreated(SurfaceHolder holder) {new Thread(new Runnable() {@Overridepublic void run() {VideoPlayer.play(surfaceHolder.getSurface());}}).start();}

那重点来了,说一说VideoPlayer用到了FFmpeg哪些东西

获取视频格式的环境,打开MP4文件

AVFormatContext *pFormatCtx = avformat_alloc_context();if (avformat_open_input(&pFormatCtx, file_name, NULL, NULL) != 0) {LOGD("Couldn't open file:%s\n", file_name);return -1; // Couldn't open file}

查看是否有流,如果那就看是否有视频流

    if (avformat_find_stream_info(pFormatCtx, NULL) < 0) {LOGD("Couldn't find stream information.");return -1;}int videoStream = -1, i;for (i = 0; i < pFormatCtx->nb_streams; i++) {if (pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO&& videoStream < 0) {videoStream = i;}}if (videoStream == -1) {LOGD("Didn't find a video stream.");return -1; // Didn't find a video stream}

获得视频解码器环境,然后看这个解码器是否能够开启

    AVCodecContext *pCodecCtx = pFormatCtx->streams[videoStream]->codec;// Find the decoder for the video streamAVCodec *pCodec = avcodec_find_decoder(pCodecCtx->codec_id);if (pCodec == NULL) {LOGD("Codec not found.");return -1; // Codec not found}if (avcodec_open2(pCodecCtx, pCodec, NULL) < 0) {LOGD("Could not open codec.");return -1; // Could not open codec}

通过surface获取目前手机屏幕给这个Surface的内存空间

    // 获取native windowANativeWindow *nativeWindow = ANativeWindow_fromSurface(env, surface);// 获取视频宽高int videoWidth = pCodecCtx->width;int videoHeight = pCodecCtx->height;// 设置native window的buffer大小,可自动拉伸ANativeWindow_setBuffersGeometry(nativeWindow, videoWidth, videoHeight,WINDOW_FORMAT_RGBA_8888);ANativeWindow_Buffer windowBuffer;if (avcodec_open2(pCodecCtx, pCodec, NULL) < 0) {LOGD("Could not open codec.");return -1; // Could not open codec}

转格式

   struct SwsContext *sws_ctx = sws_getContext(pCodecCtx->width,pCodecCtx->height,pCodecCtx->pix_fmt,pCodecCtx->width,pCodecCtx->height,AV_PIX_FMT_RGBA,SWS_BILINEAR,NULL,NULL,NULL);

首先这个解码是在一个循环里,然后解码,和之前一样一帧一帧的解码,但是如果一帧太大那就下一次循环里继续解码

avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished, &packet);

释放资源

    av_free(buffer);av_free(pFrameRGBA);// Free the YUV frameav_free(pFrame);// Close the codecsavcodec_close(pCodecCtx);// Close the video fileavformat_close_input(&pFormatCtx);

完了,说是完了,这只是开始,我对FFmpeg的学习也是开始,以后我可能断断续续的分享我使用FFmpeg的心得。

Android 音视频深入 六 使用FFmpeg播放视频(附源码下载)相关推荐

  1. android画板需求分析,Android编程实现画板功能的方法总结【附源码下载】

    本文实例讲述了Android编程实现画板功能的方法.分享给大家供大家参考,具体如下: Android实现画板主要有2种方式,一种是用自定义View实现,另一种是通过Canvas类实现.当然自定义Vie ...

  2. android flv 编码器,Android 音视频深入 十七 FFmpeg 获取 RTMP 流保存为 flv (附源码下载)...

    Android 音视频深入 十七 FFmpeg 获取 RTMP 流保存为 flv (附源码下载) 项目地址 https://github.com/979451341/RtmpSave 这个项目主要代码 ...

  3. 短视频去水印多功能工具箱微信小程序源码下载支持多种流量主

    没错这是一款以去水印为主的一款多功能微信小程序源码 该小程序源码除了拥有去水印功能以外还拥有N款其它实用的功能 比如喝酒神器,短网址生成,历史上的今天等等如下: 短视频去水印(自带接口,速度非常快) ...

  4. android+仿iphone,Android编程实现仿iphone抖动效果的方法(附源码)

    Android编程实现仿iphone抖动效果的方法(附源码) 时间:2021-05-20 本文实例讲述了Android编程实现仿iphone抖动效果的方法.分享给大家供大家参考,具体如下: 布局文件: ...

  5. Android 百度地图-实现POI的搜索(搜索周边)附源码

    首先贴出主要代码 Activity package cn.yhsh.maptest;import java.util.ArrayList; import utils.PoiOverlay; impor ...

  6. Android 利用广播实现黑名单【指定号码】的短信的拦截 附源码下载链接

    Android 利用广播实现指定号码的短信的拦截 根据最近的学习内容,今天实现了利用广播进行指定号码的拦截 步骤: ①.写一个数据库的帮助类,实现对数据库的创建,总共创建两个数据库psms(受保护的短 ...

  7. 依米花音乐播放器php源码下载

    仿依米花音乐播放器是一款简约的HTML悬浮音乐播放器,免费分享和之前分享的绚丽彩虹在线音乐播放器生成源码差不多,功能界面都是大同小异的.这款依米花音乐播放器php源码支持网易云/QQ音乐,可搭建类是与 ...

  8. Android 统一打包框架(附源码下载)

    唠叨: 把手给我,我带你去吃云浮吃石磨肠粉.云吞面,木瓜渣. 那里的肠粉和广州的不一样,皮很薄很滑,肉馅没广州的那么花里胡哨,只有肉碎和香葱.但吃起来就很香滑,再配上它的甜辣酱.那味道好极了. 云吞面 ...

  9. 【博主推荐】html好看的音乐播放器(附源码)

    html好看的音乐播放器 文章目录 1.主界面列表效果 2.主界面详情效果 3.背景风格1-背景色轮动 4.背景风格2-图片轮动 5.MP3免费下载 5.1 MyFreeMP3 5.2.铜钟音乐 源码 ...

最新文章

  1. vim技巧总结-查找
  2. PHP 使用 AES/ECB/PKCS7 padding 加密
  3. ORACLE REDO 日志调整
  4. 使用Spring提供Quartz来实现定时任务
  5. Java实现字母的大小写转换
  6. AngularJs通过路由传参解决多个页面资源浪费问题
  7. jquery之DataTables的使用
  8. ASP.NET伪静态的方法及相关资料
  9. 小肽相关1~peptidomic discovery of short open reading frame–encoded peptides in human cells
  10. NiFi 学习 —自己实现处理器
  11. 使用工具(JD-GUI和APKIDE)反编译JAR的方法
  12. android 仿QQ列表可折叠+自定义Dialog结合的DEMO
  13. mysql 自己的ip怎么查看_如何查看连接mysql的ip地址
  14. 苹果公司的iPhone产品以及其历史
  15. JS偏函数、组合函数、缓存函数
  16. 滴滴云A100 40G 性能测试 V100陪练!
  17. 基于Robotics Toolbox的机械臂工作空间求解
  18. 超分文章记录 SRCNN-FSRCNN-ESPCN-VDCN-DRCN-RDN-LapSRN-SRDenseNet-SRGAN
  19. abp 链接本地mysql_ABP Vnext使用mysql数据库
  20. 硬核! 逛了4年Github ,一口气把我收藏的 Java 开源项目分享给你!

热门文章

  1. 访问网上计算机要输入密码,教大家访问电脑显示输入网络密码怎么办
  2. 《财务自由之路I》阅读笔记2021-03-16
  3. excel表格xlsx密码强制解除手机,忘记excel表格xlsx密码如何找回?
  4. java apex_Apex基础知识(一)
  5. Spring Cloud踩坑指南
  6. saber软件安装常见问题
  7. php 模板渲染,ThinkPHP6.0模板渲染 - ThinkPHP6.0快速开发手册(案例版) - php中文网手册...
  8. python和c++情侣网名_“果然,他用的是情侣网名!”
  9. IDEA 如何 buil dpath
  10. 使用pandas清洗携程旅游数据