问题描述

在开发中使用某摄像头的SDK,只能获取到一帧帧的 H264 视频数据,不知道视频流地址,需要自己解码出图像并播放。

问题解决

编译FFmpeg

此处省略,这里有 编译好的库,上传到Github了。

开发环境配置

1、 配置 AndroidStudio 的 NDK 路径。
2、 配置 app 的 build.gradle ,添加 CMake 参数

android {defaultConfig {externalNativeBuild {cmake {cppFlags "-std=c++11 -frtti -fexceptions"abiFilters 'armeabi', 'armeabi-v7a', 'x86',"arm64-v8a"}}}}externalNativeBuild {cmake {path "CMakeLists.txt"}}
}

3、在 app/src/main 下新建 jniLibs 文件夹,将编译后的 ffmpeg 库的 .so 文件拷贝进来,拷贝后如下:

4、在 app/src/main 下新建 cpp 文件夹,
5、在app/src/main/cpp下新建 include 文件夹,将编译后的 ffmpeg 的 include 拷贝进来。拷贝后的目录结构如下:

6、在app/src/main 下新建 jni ,这里放自自己的 C 代码。
7、 在app的根目录新建 CMakeLists.txt,输入类似下面的代码

cmake_minimum_required(VERSION 3.4.1)#工程绝对路径
set(pathToProject  我的工程根目录的绝对路径)
#新建的cpp目录的路径
set(pathToCpp ${pathToProject}/app/src/main/cpp)
#新建的jni目录的路径
set(pathToJni ${pathToProject}/app/src/main/jni)
#jniLibs 目录的路径
set(pathToJniLibs ${pathToProject}/app/src/main/jniLibs)
#ffmpeg include 目录
set(pathToInclude ${pathToCpp}/include)
# 我的源文件路径(这里只需要写 .c 或者 .cpp 即可,他们依赖的 .h 会被自动引入)
set(pathOfSource${pathToJni}/converter.c${pathToJni}/decoder.c${pathToJni}/render.c${pathToJni}/looper.c${pathToJni}/h264_render.c${pathToJni}/jni_h264_render.c)#设置include
include_directories(${pathToInclude}/${ANDROID_ABI})
#导入ffmpeg 库
add_library( libavcodec SHARED IMPORTED)
add_library( libavdevice SHARED IMPORTED)
add_library( libavfilter SHARED IMPORTED)
add_library( libavformat SHARED IMPORTED)
add_library( libavutil SHARED IMPORTED)
add_library( libpostproc SHARED IMPORTED)
add_library( libswresample SHARED IMPORTED)
add_library( libswscale SHARED IMPORTED)set_target_properties(libavcodec  PROPERTIES IMPORTED_LOCATION ${pathToJniLibs}/${ANDROID_ABI}/libavcodec-57.so)
set_target_properties(libavdevice  PROPERTIES IMPORTED_LOCATION ${pathToJniLibs}/${ANDROID_ABI}/libavdevice-57.so)
set_target_properties(libavfilter  PROPERTIES IMPORTED_LOCATION ${pathToJniLibs}/${ANDROID_ABI}/libavfilter-6.so)
set_target_properties(libavformat  PROPERTIES IMPORTED_LOCATION ${pathToJniLibs}/${ANDROID_ABI}/libavformat-57.so)
set_target_properties(libavutil  PROPERTIES IMPORTED_LOCATION ${pathToJniLibs}/${ANDROID_ABI}/libavutil-55.so)
set_target_properties(libpostproc PROPERTIES IMPORTED_LOCATION ${pathToJniLibs}/${ANDROID_ABI}/libpostproc-54.so)
set_target_properties(libswresample PROPERTIES IMPORTED_LOCATION ${pathToJniLibs}/${ANDROID_ABI}/libswresample-2.so)
set_target_properties(libswscale PROPERTIES IMPORTED_LOCATION ${pathToJniLibs}/${ANDROID_ABI}/libswscale-4.so)#声明自己的C代码编译后产出的so
add_library( decoder SHARED ${pathOfSource} )#自己的so库的link配置
target_link_libraries( decoder#NDK日志库,提供日志输出log#NDK的Native Android API android#FFmpeg库libavcodeclibavdevicelibavfilterlibavformatlibavutillibpostproclibswresamplelibswscale)

Android使用FFmpeg 解码H264并播放(一)相关推荐

  1. ffmpeg 切片花屏_利用ffmpeg解码H264,花屏,该如何解决

    利用ffmpeg解码H264,花屏 UINT CMP4File::VideoCap_Thread_Fun(void* pParam) { CMP4File  *pMP4File=(CMP4File*) ...

  2. ffmpeg解码H264缺少帧的解决办法

    最近用ffmpeg解码H264裸码流文件,发现解码总是少几帧.上网查了些资料,解决了. 当使用avcodec_decode_video2时,如果第三个参数的值为1,则表示完成一帧的解码,如果为0,表示 ...

  3. 使用FFMPEG解码和OpenAL播放音乐

    使用FFMPEG解码和OpenAL播放音乐 OpenAL是一个开源的音效库,然而这里只用它来播放音乐.  FFMPEG负责把音乐解码并转换成指定的编码和采样率,然后送到OpenAL中播放.  (已在w ...

  4. android下实时传输h264并播放

    这周给安排了个任务,在android端读取H264原始视频数据,传一帧播一帧,播就播吧,还要Socket实时传输实时播,虽然并没有接触过,都无从下手,不过想到直播都是这么个形式,说明肯定是行得通的,而 ...

  5. Android使用MediaCodec解码H264视频解码器

    前些日子有写了一篇博客[Android使用MediaCodec硬解码播放H264格式视频文件](http://blog.csdn.net/true100/article/details/5399293 ...

  6. FFmpeg解码H264裸流并转换成opencv Mat

    感谢雷霄骅博士的在中文视频编解码的付出,http://blog.csdn.net/leixiaohua1020 最近要搞一些视频推流的事情,要解析H264裸流并且获取opencv格式的Mat数据给算法 ...

  7. (转)FFMPEG解码H264拼帧简解

    http://blog.csdn.net/ikevin/article/details/7649095 H264的I帧通常 0x00 0x00 0x00 0x01 0x67 开始,到下一个帧头开始之前 ...

  8. android ffmpeg 解码,如何在Android用FFmpeg解码图像

    白猪掌柜的 创建一个VideoPicture结构体用来保存解码出来的图像./** SDL_Lesson.c** Created on: Aug 12, 2014* Author: clarck*/#i ...

  9. FFmpeg解码的全能播放器

    http://www.eoeandroid.com/thread-53373-1-1.html

  10. Live555接收h264使用ffmpeg解码为YUV420

    本文概要: 本文介绍了一种常用成熟的多媒体解码方案.使用live555作为流媒体数据源,建立rtsp会话请求h264数据流.后端使用ffmpeg解码h264流并保存为yuv420格式. 该方案比较成熟 ...

最新文章

  1. php json.parse,PHP JSON头导致JSON.parse出错(使用jQuery)
  2. 10冰点还原安装不了_荣耀智慧屏X1性能有多强?荣耀智慧屏X1怎么安装第三方软件?...
  3. Linux环境软RAID 5 搭建
  4. 操作系统服务:logging日志记录模块
  5. 64位内核开发第二讲.内核编程注意事项,以及UNICODE_STRING
  6. 【C语言】分别用下标法,地址法和指针法输出数组中的全部元素
  7. 云原生的本质_什么是云原生?云原生和传统软件有什么区别?有什么特征
  8. 手机有没有必要经常更新系统?
  9. 一张纸厚度大约是什么_折叠103次,纸厚度就能超过宇宙直径?科学家解释让人如坠冰窖!...
  10. java - 小程序二维码中间的logo占整个二维码的比例计算
  11. 《计算机组成原理(微课版)》第1章课后习题答案
  12. 国美做手机、天猫玩魔盒……电商做产品到底会怎么辣眼睛
  13. 微信新年祝福php代码,微信版新年祝福语
  14. CF 449E Jzzhu and Squares解题报告
  15. 直播公司转让,转让直播文网文-网络文化经营许可证
  16. Glusterfs + heketi使用
  17. Socially-Motivated Cooperative Mobile Edge Computing论文阅读
  18. html初级入门,HTML初级教程 简介及入门
  19. ASUS华硕飞行堡垒fx80gd怎么用Fn+F5功能控制风扇转速
  20. Pandas_C3_分组cheat sheet

热门文章

  1. 最佳适应(BestFit)算法
  2. pandas_计算年化收益率
  3. 【luogu3403】跳楼机 [同余最短路]
  4. dell服务器设置bios设置u盘启动不了系统,详解戴尔通过BIOS设置U盘启动的技巧
  5. 一根不均匀的绳子,全部烧完需要1个小时,问怎样烧能计时1个小时15分钟
  6. 1158: 零基础学C/C++158——删除中间的*
  7. 立体栅格地图_基于八叉树表示的三维栅格地图路径规划系统及方法与流程
  8. 机器学习.周志华《15 规则学习 》
  9. 腾讯AI Lab招聘实习生(内推)
  10. Twitter上热门的技巧与思路