美文网首页
FFmpeg Jni编译及音视频水印合成初识

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

作者: CHSmile | 来源:发表于2018-12-13 21:30 被阅读79次

    前言

    • FFmpeg 初识
      FFmpeg 是一个跨平台的音视频流方案,它提供了录制、转换以及流化音视频的完整解决方案,它包含了非常先进的音频/视频编解码库libavcodec。
      FFmpeg 主要工具和常用类库:
    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

    相关文章

      网友评论

          本文标题:FFmpeg Jni编译及音视频水印合成初识

          本文链接:https://www.haomeiwen.com/subject/ycahhqtx.html