FFmpeg Jni编译及音视频水印合成初识

2018-12-13  本文已影响79人  CHSmile

前言

  1. FFMpeg 音视频转换器转换多媒体文件之间的格式的一个命令行工具
  2. 用 FFmpeg 实现的 rstp 服务器 基于 HTTP、RTSP 用于实时广播的串流服务器
  3. FFplay 一个简单的媒体播放器使用ffmpeg解析和解码通过SDL显示
  4. libavcodec 一个包含了所有 FFmpeg 音视频编解码器的库
  5. libavformat 用于各种音视频封装格式的生成和解析,包括获取解码所需
    信息以生成解码上下文结构和读取音视频帧等功能
  6. libavfilter 包含媒体滤波器的一个库

对视频文件进行编码,转码,播放,剪辑,加字幕都可以用到ffmpeg,以ffmpeg 播放多媒体为例:详解
Media File -->Demux(解复用) --> 解码(Decode) --> YUV/RGB数据

1. FFmpeg Jni 编译

以FFmpeg X264编码库 AAC编码库交叉编译为例。首先:先下载对应源码,将x264、aac文件放到ffmpeg对应目录;然后编写生成.so文件脚本;最后交叉编译,生成最终可使用的ffmpeg .so文件。源码

  1. 编写本地native 函数方法
  2. 新建jni 目录,在该目录下创建.c 文件,然后对文件javah -jni操作,生成对应的.h头文件
  3. 在jni目录下增加两个文件,Android.mk和Application.mk
  1. 选填 C++ 支持与 C++ standard选项
  2. 自动构建生成接口,只需修改native函数
  3. 修改native文件与函数,拷贝ffmpeg 编译源文件及 so文件至cpp 目录
  4. 调用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

上一篇下一篇

猜你喜欢

热点阅读