教程代码:【Github传送门:https://github.com/ChenLittlePing/LearningVideo】
目录
一、Android音视频硬解码篇:
二、使用OpenGL渲染视频画面篇
三、Android FFmpeg音视频解码篇
本文你可以了解到
利用 FFmpeg 对音视频进行简单的解封和重新封装,不涉及解码和编码,为下一篇讲解如何对编辑好的视频进行重编码和封装做好铺垫。
一、前言
前面的文章中,对 FFmpg 视频的解码,以及如何利用 OpenGL 对视频进行编辑和渲染,做了详细的讲解,接来非常重要的,就是对编辑好的视频进行编码和保存。
当然了,在了解如何编码之前,先了解如何对编码好的音视频进行封装,会有事半功倍的效果。
在《音视频解封和封装:生成一个MP4》中使用了 Android 的原生功能,实现了对音视频的重打包。FFmpeg 也是同样的,只不过流程更为繁琐一些。
二、初始化封装参数
我们知道,将编码数据封装到 Mp4 中,需要知道音视频编码相关的参数,比如编码格式,视频的宽高,音频通道数,帧率,比特率等,下面就先看看如何初始化它们。
首先,定一个打包器 FFRepacker:
// ff_repack.h
class FFRepack {
private:
const char *TAG = "FFRepack";
AVFormatContext *m_in_format_cxt;
AVFormatContext *m_out_format_cxt;
int OpenSrcFile(char *srcPath);
int InitMuxerParams(char *destPath);
public:
FFRepack(JNIEnv *env,jstring in_path, jstring out_path);
};
初始化过程分为两个步骤:打开原视频文件、初始化打包参数。
// ff_repack.cpp
FFRepack::FFRepack(JNIEnv *env, jstring in_path, jstring out_path) {
const char *srcPath = env->GetStringUTFChars(in_path, NULL);
const char *destPath = env->GetStringUTFChars(out_path, NULL);
// 打开原视频文件,并获取相关参数
if (OpenSrcFile(srcPath) >= 0) {
// 初始化打包参数
if (InitMuxerParams(destPath)) {
LOGE(TAG, "Init muxer params fail")
}
} else {
LOGE(TAG, "Open src file fail")
}
}
打开原视频,获取原视频参数
代码很简单,在使用 FFMpeg 解码的文章中就已经讲解过。如下:
// ff_repack.cpp