版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
背景
通常我们见到的转码主要是视频转码(Video Transcoding)和音频转码(Audio Transcoding),尤其视频转码
是最重要的。视频转码是指将已经压缩编码的视频码流转换成另一个视频码流,以适应不同的网络带宽、不同的终端处理能力和不同的用户需求。转码本质上是一个先解码,再编码的过程,因此转换前后的码流可能遵循相同的视频编码标准,也可能不遵循相同的视频编码标准。海思3531D,3559A都是同编同解能力的芯片,即Hi3531D具有12路同时编码和同时解码的能力,Hi3559A具有16路同时编码和同时解码能力,所以做转码应用最适合不过了。
不同的时代有不同的转码需求,当前最流行的是H264转成H265,这是因为同等编码质量条件下,H265编码所占的带宽可以节省25%,这对于带宽昂贵的兔子国来说尤为重要。
简介
该示例程序演示了如何将一个文件进行转码并重新封装的过程
建议先运行Record程序录制一段视频,确保生成test.mp4文件可用
准备工作
- 参照用户手册搭建开发环境、编译3531D工程、配置网络启动参数。
- 准备一个可播放的文件命名为test.mp4
- 上电,进入
/root/demo
目录 - 运行
FileTranscode
程序 - 等待程序自动退出
- 将test2.mp4拷贝到主机中进行播放,确认转码有效
运行结果
源代码
完整的工程参见:https://gitee.com/LinkPi/3531D/tree/master/FileTranscode
//main.cpp
#include <QCoreApplication>
#include "Link.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Link::init();
LinkObject *file=Link::create("InputFile");
LinkObject *dec=Link::create("DecodeV");
QVariantMap dataDec;
dataDec["block"]=true;
dec->start(dataDec);
LinkObject *encV=Link::create("EncodeV");
QVariantMap dataEncV;
dataEncV["codec"]="h265";
dataEncV["width"]=-1;
dataEncV["height"]=-1;
dataEncV["rcmode"]="vbr";
dataEncV["bitrate"]=1000;
encV->start(dataEncV);
LinkObject *mp4=Link::create("Mux");
QVariantMap dataMP4;
dataMP4["path"]="test2.mp4";
mp4->start(dataMP4);
file->linkV(dec)->linkV(encV)->linkV(mp4);
file->linkA(mp4);
QObject::connect(file,&LinkObject::newEvent,[=](QString type,QVariant){
if(type=="EOF")
{
mp4->stop(true);
exit(0);
}
});
QVariantMap dataFile;
dataFile["path"]="test.mp4";
dataFile["sync"]=false;
file->start(dataFile);
return a.exec();
}