FFmpeg Jni编译及音视频水印合成初识
2018-12-13 本文已影响79人
CHSmile
前言
- FFmpeg 初识
FFmpeg
是一个跨平台的音视频流方案,它提供了录制、转换以及流化音视频的完整解决方案,它包含了非常先进的音频/视频编解码库libavcodec。
FFmpeg 主要工具和常用类库:
- FFMpeg
音视频转换器转换多媒体文件
之间的格式的一个命令行工具- 用 FFmpeg 实现的 rstp 服务器 基于 HTTP、RTSP 用于
实时广播
的串流服务器- FFplay 一个简单的媒体播放器使用ffmpeg
解析和解码
通过SDL显示- libavcodec 一个包含了所有 FFmpeg
音视频编解码器
的库- libavformat 用于各种音视频封装格式的
生成和解析
,包括获取解码所需
信息以生成解码上下文结构和读取音视频帧等功能- libavfilter 包含媒体
滤波器
的一个库
对视频文件进行编码,转码,播放,剪辑,加字幕都可以用到ffmpeg,以ffmpeg 播放多媒体为例:详解
Media File -->Demux(解复用) --> 解码(Decode) --> YUV/RGB数据
1. FFmpeg Jni 编译
以FFmpeg X264编码库 AAC编码库交叉编译为例。首先:先下载对应源码,将x264、aac文件放到ffmpeg对应目录;然后编写生成.so文件脚本;最后交叉编译,生成最终可使用的ffmpeg .so文件。源码
- ndk-build 详解
- 编写本地native 函数方法
- 新建jni 目录,在该目录下创建.c 文件,然后对文件javah -jni操作,生成对应的.h头文件
- 在jni目录下增加两个文件,Android.mk和Application.mk
- cmake 详解
- 选填 C++ 支持与 C++ standard选项
- 自动构建生成接口,只需修改native函数
- 修改native文件与函数,拷贝ffmpeg 编译源文件及 so文件至cpp 目录
- 调用jni 方法,并编写CMakeLists.txt编译脚本
两种方式编译可以在Android下执行命令的FFmpeg,一种是传统的ndk-build工具,一种是cmake工具,实际项目经常使用cmake,因为as对它支持的非常好
2. FFmpeg 音视频水印合成
小需求:视频教学过程中,每20s取一帧,在教学结束后,生成一个10s视频,视频包括封面,添加水印并加上背景音乐
开启线程20s 取一帧数据,保存本地临时文件夹,并做文件读写操作,将封面、水印图片以及音频文件一并拷贝同一目录。最后随机取出150帧,合成视频并添加水印和背景音乐
- 具体步骤:
1. native 层获取相机每一帧(声网sdk),后续的图像处理一般都是rgb格式,而opencv中mat中需要存储成rgb格式,就需要从yuv到rgb或者bgr的转换。
2. 可以通过FFmpeg/opencv 完成yuv420p转化rgb,再通过data数据转成Mat数据,并实现opencv-imwrite方法写本地文件。
3. 最后java层通过完成图片抽取,并通过ffmpeg 命令完成音视频合成,背景音乐添加。
转载:
YUV420格式数据介绍
ffmpeg解码后的yuv420P数据保存为opencv中mat格式
Android中摄像头获取的YUV数据转Opencv的Mat