Qt5+FFmpeg实现视频软解码播放

基本流程

  1. 使用FFmpeg解封装获取视频流
  2. 对视频流进行解码得到原始数据
  3. 将解码后的数据转换为Qt可显示的格式
  4. 使用Qt组件显示视频画面

主要步骤

1. 初始化FFmpeg

1
2
3
4
5
6
// 注册所有组件
av_register_all();
// 打开视频文件
avformat_open_input(&formatContext, filename, nullptr, nullptr);
// 获取流信息
avformat_find_stream_info(formatContext, nullptr);

2. 查找视频解码器

1
2
3
4
// 获取视频流索引
videoIndex = av_find_best_stream(formatContext, AVMEDIA_TYPE_VIDEO, -1, -1, nullptr, 0);
// 获取解码器
AVCodec *codec = avcodec_find_decoder(formatContext->streams[videoIndex]->codecpar->codec_id);

3. 解码并显示

1
2
3
4
5
6
7
8
9
10
11
12
// 读取视频帧
av_read_frame(formatContext, packet);
// 解码
avcodec_send_packet(codecContext, packet);
avcodec_receive_frame(codecContext, frame);
// 转换为RGB格式
sws_scale(swsContext, frame->data, frame->linesize, 0, codecContext->height,
frameRGB->data, frameRGB->linesize);
// 显示画面
QImage image(frameRGB->data[0], codecContext->width, codecContext->height,
QImage::Format_RGB32);
label->setPixmap(QPixmap::fromImage(image));

部分代码图片

图片1
图片1
图片1
图片1
图片1
图片1
图片1
图片1
图片1
图片1