当前位置:   article > 正文

基于FFmpeg的Qt视频播放器_qt ffmpeg 播放器

qt ffmpeg 播放器

ffmpeg作为开源库,具备跨平台性,被广泛使用于各大视频软件和网站,在视音频开发中占有极其重要的地位。

Qt同样支持跨平台,因此结合qt+ffmpeg制作跨平台视频播放器是比较合适的做法。

​一、环境介绍

操作系统: win10 64位
QT版本: QT5.14.0
编译器: MinGW 64
FFMPEG版本: 4.2.2

二、FFMPEG解码步骤

(1)首先定义需要用到的结构体,在本客户端中,主要用到了以下结构体。

AVFormatContext 保存需要读入的文件的格式信息,比如流的个数以及流数据等

AVCodecContext 保存了相应流的详细编码信息,比如视频的宽、高,编码类型等。

AVCodec 真正的编解码器,其中有编解码需要调用的函数

AVFrame用于保存数据帧的数据结构

AVFrame 用于保存转换之后的帧

SwsContext 转换器,用于将YUV420P类型的图片转换为RGB类型

AVPacket 解析文件时会将音/视频帧读入到packet中

(2)注册解码器,并且初始化自定义的AVIOContext,目的是在主机内存中申请内存空间,并将AVFormatContext的pb指针指向它。在使用avformat_open_input()打开媒体数据的时候,就可以不指定文件的URL了,即其第2个参数为NULL,读取的数据是由read_buffer()提供,read_buffer是回调函数,需要自定义read_buffer使其在视频解码时得到对应的数据。

av_register_all();

in_fmt_ctx = avformat_alloc_context();

unsigned char *aviobuffer=(unsigned char *)av_malloc(1024*15);

AVIOContext*avio=avio_alloc_context(aviobuffer,1024*15 ,0,NULL,read_buffer, NU L L,NULL);

in_fmt_ctx->pb=avio;

int read_buffer(void *opaque, uint8_t *buf, int buf_size){......}

(3)读取接收到的数据的基本信息,用于设置解码器类型。avformat_open_input函数只是读取接收到的数据头,并不会填充流信息,因此我们需要接下来调用avformat_find_stream_info获取流信息,并确定所有的流信息。根据读取到的信息设置解码器的解码类型和解码的宽高度,使用avcodec_open2初始化解码器。

if(avformat_open_input(&in_fmt_ctx,NULL,NULL,NULL)!=0){......}

if(avformat_find_stream_info(in_fmt_ctx,NULL)<0){......}

videoindex=-1;

for(i=0; i<in_fmt_ctx->nb_streams; i++) {.....}//在这里查找视频流

pCodecCtx=in_fmt_ctx->streams[videoindex]->codec;

pCodec=avcodec_find_decoder(pCodecCtx->codec_id);

if(avcodec_open2(pCodecCtx, pCodec,NULL)<0){......}

(4)使用av_read_frame可以将从内存中读取的一帧数据存入packet中。通过avcodec_decode_video2调用相应的解码器,将解码后的数据存入AVFrame 中。解码之后存入AVFrame中数数据是YUV420P类型的,Y、U、V分别存放在pFrame->data[0]、pFrame-

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/758452
推荐阅读
相关标签
  

闽ICP备14008679号