欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android使用FFmpeg 解码H264并播放(一)

程序员文章站 2022-03-17 11:03:38
...

问题描述

在开发中使用某摄像头的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 文件拷贝进来,拷贝后如下:

Android使用FFmpeg 解码H264并播放(一)

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

Android使用FFmpeg 解码H264并播放(一)

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 
nclude_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库
                       libavcodec
                       libavdevice
                       libavfilter
                       libavformat
                       libavutil
                       libpostproc
                       libswresample
                       libswscale

                       )
相关标签: