ffmpeg mp4视频流解码

您所在的位置:网站首页 mp4格式封装 ffmpeg mp4视频流解码

ffmpeg mp4视频流解码

2024-07-15 01:38:42| 来源: 网络整理| 查看: 265

参考的这篇文章 写的不错 https://blog.csdn.net/zwz1984/article/details/82824524

1.当我们播放一个媒体文件时,通常需要经过以下几个步骤

在这里插入图片描述

①解封装(Demuxing):就是将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据。封装格式种类很多,例如MP4,MKV,RMVB,TS,FLV,AVI等等,它的作用就是将已经压缩编码的视频数据和音频数据按照一定的格式放到一起。例如,FLV格式的数据,经过解封装操作后,输出H.264编码的视频码流和AAC编码的音频码流。

②解码(Decode):就是将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。音频的压缩编码标准包含AAC,MP3等,视频的压缩编码标准则包含H.264,MPEG2等。解码是整个系统中最重要也是最复杂的一个环节。通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如YUV、RGB等等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如PCM数据。

③音视频同步:就是根据解封装模块处理过程中获取到的参数信息,同步解码出来的音频和视频数据,并将音视频频数据送至系统的显卡和声卡播放出来(Render)。

2.FFMPEG音视频解码

通过上面对媒体文件播放步骤的了解,我们在解码多媒体文件的时候需要经过两个步骤,即解封装(Demuxing)和解码(Decode)。下面就来看一下FFMPEG解码媒体文件的时候是怎样做这两个步骤的。 在这里插入图片描述 在使用FFMPEG解码媒体文件之前,我们首先需要注册FFMPEG的各种组件,通过

av_register_all(); 这个函数,可以注册所有支持的容器和对应的codec。之后我们通过

AVFormatContext *pFormatCtx = avformat_alloc_context(); avformat_open_input(&pFormatCtx,input_cstr,NULL,NULL); avformat_find_stream_info(pFormatCtx,NULL); 来打开一个媒体文件,并获得媒体文件封装格式的上下文。之后我们就可以通过遍历定义在libavformat/avformat.h里保存着媒体文件中封装的流数量的nb_streams在媒体文件中分离出音视频流。

分离出音视频流之后,就可以对音视频流分别进行解码了,这里先以视频解码为例,我们可以遍历AVStream找到codec_type为AVMEDIA_TYPE_VIDEO的的AVStream即为视频流的索引值。

//视频解码,需要找到视频对应的AVStream所在pFormatCtx->streams的索引位置 int video_stream_idx = -1; int i = 0; for(; i < pFormatCtx->nb_streams;i++){ //根据类型判断,是否是视频流 if(pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO){ video_stream_idx = i; break; } }

然后我们就可以通过AVStream来找到对应的AVCodecContext即编解码器的上下文。之后就可以通过这个上下文,使用

avcodec_find_decoder() 来找到对应的解码器,再通过

avcodec_open2() 来打开解码器,AVFormatContext、AVStream、AVCodecContext、AVCodec四者之间的关系为 在这里插入图片描述

打开解码器之后,就可以循环的将一帧待解码的数据AVPacket送给

avcodec_decode_video2() 进行解码,解码之后的数据存放在AVFrame里面。

3.视频解码示例代码 #include extern "C" { #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" #include "libswscale/swscale.h" }

说一下头文件 为啥要加 extern c 吧

ffmpeg 是c 写的, 如果你不加extern c 的话 就会报链接错误,因为按照c++编译方式 函数名字会变 所以链接错误 如下图: 在这里插入图片描述

#include extern "C" { #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" #include "libswscale/swscale.h" } AVFormatContext* ac = nullptr; int main() { av_register_all(); AVFormatContext* formatContext = avformat_alloc_context(); if (avformat_open_input(&formatContext, "C://工作//webrtc//2-9-10.mp4", NULL, NULL) != 0) { std::cout if (formatContext->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) { videoStreamIndex = i; break; } } if (videoStreamIndex == -1) { std::cout codec; AVCodec* codec = avcodec_find_decoder(codecContext->codec_id); if (codec == nullptr) { std::cout if (packet->stream_index == videoStreamIndex) { ret = avcodec_decode_video2(codecContext, frame, &gotPicture, packet); if (ret sws_scale(swsContext, frame->data, frame->linesize, 0, codecContext->height, yuvFrame->data, yuvFrame->linesize); int ySize = codecContext->width * codecContext->height; fwrite(yuvFrame->data[0], 1, ySize, yuvFile); fwrite(yuvFrame->data[1], 1, ySize / 4, yuvFile); fwrite(yuvFrame->data[2], 1, ySize / 4, yuvFile); frameCout++; std::cout


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭