【FFmpeg+Qt开发】转码流程 H.264 转(mov、mp4、avi、flv)等视频格式 示例详解

您所在的位置:网站首页 MP4文件转换成AVI 【FFmpeg+Qt开发】转码流程 H.264 转(mov、mp4、avi、flv)等视频格式 示例详解

【FFmpeg+Qt开发】转码流程 H.264 转(mov、mp4、avi、flv)等视频格式 示例详解

2024-03-07 09:06| 来源: 网络整理| 查看: 265

目录

 一、FFMPEG 转码

1.1转码流程

1.2转码示例

🚗本文主要是基于FFMPEG技术编解码,继续延申,对FFMPEG转码部分进行详细介绍

🚗希望对正在学习FFMPEG技术的小伙伴们有所帮助!

 一、FFMPEG 转码

1.1转码流程

上文对FFmpeg编码部分进行介绍完之后,我们得到了H.264的压缩码流数据。

但是,我们常用的播放器是没办法打开这样的视频文件的,那么可以由此思考一下,如何才能够将这样的文件转换成我们能够播放的视频文件呢?

没错!这里就需要用到我们的转码了!

🔴转码:视频转码技术将视频信号从一种格式转换 成另外一种格式 (例如:H.254 转成 MP4)

mp4、flv、avi、mov等 这些皆为我们常看到的视频格式。

另外,许多现有的视频会议系统是基于旧的视频编码标准H.263而建立,而最新的视频会议系统采用了H.264基线规范。因此,实时视频转码技术是实现两者之间通信的必不可少的因素!

转码的流程图,如下图所示:

在正式进入转码的讲解之前,首先先了解一下相关的原理,这其中就包括了I/B/P帧,以及我们的时间基PTS/DTS设置。

I/B/P帧:

I帧又称为内部画面,是关键帧,它采用帧内压缩法,也称为“关键帧”压缩法;B帧是双向预测的帧间压缩算法。当把一帧压缩成B帧时,它根据相邻的前一帧、本帧以及后一帧数据的不同点来压缩本帧,也即仅记录本帧与前后帧的差值。一般地,I帧压缩效率最低,P帧较高,B帧最高;P帧由在它前面的B帧或者I帧预测而来,它比较与它前面的P帧或者I帧之间的相同信息或数据,也即考虑运动的特性进行帧间压缩。

举例说明:

如下图所示,红色I帧、蓝色P帧、绿色B帧

显示的顺序是1,2,3,4,5,6,解码的顺序就为1,2,5,3,4

为什么是这样呢?这里就涉及了PTS和DTS,下面来讲一下。

时间基 PTS/DTS:

PTS是渲染用的时间戳,我们视频帧是按照PTS时间戳来展示的DTS是解码时间戳,用于视频解码的

1.如果没有B帧,PTS=DTS ;

2.如果有B帧,就需要更大的缓存来存储解码的帧数据。B帧要等I帧和P帧解码完成之后才开始。

1.2转码示例

🟢转码类的定义:

extern "C" //ffmpeg使用c语言实现的,引入用c写的代码就要用extern { #include //注册 #include //设备 #include #include #include #include } class fcoverh264 { public: fcoverh264(); //打开H264视频文件 void openFile(QString file); //根据我们需要的封装格式进行处理 void outPut(QString fileout); private: AVFormatContext *forContext,*formatout;//保存数据的结构体 forContext存输入进来的视频信息;formatout存储最终输出的视频信息 AVPacket *pkt;//pkt int videoType; };

🟢具体步骤如下:

#include "fcoverh264.h" #include extern "C" //ffmpeg使用c语言实现的,引入用c写的代码就要用extern { #include //注册 #include //设备 #include #include #include #include } fcoverh264::fcoverh264() { /* * 转码的流程: * 1.注册组件 * 2.打开视频流 打开视频文件 * 3.查找有没有流数据 * 4.查找视频码流数据 * * 6.根据要的封装格式 来猜测格式对应编辑器 * 7.打开对应文件 * 8.新建流 * 9.写入头部信息 * 10.读取一帧一帧的码流数据 * 11.转码---->时间基的转化 * 所以在解码的时候:显示顺序和解码的顺序是一样的; 处理其他视频的时候:就需要关注 显示顺序和解码的顺序是否一致了 编码有B帧? 解码:IPB * 12.写入对应的一帧数据到文件中 */ //注册组件 av_register_all(); forContext= avformat_alloc_context(); } void fcoverh264::openFile(QString file) { //打开输入视频 int res=avformat_open_input(&forContext,file.toStdString().c_str(),nullptr,nullptr); //判断是否打开成功 if(respb);//对应avio_open() qDebug()


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3