剑痴乎

  • 首页
  • 文章分类
    • 音视频
    • WebRTC
    • 编程之美
    • Linux
    • Windows
    • 生活点滴
    • 校园生活
  • 参考
    • API参考
    • 实用工具
    • 测试音视频
    • 文档
  • 留言板
  • 关于
剑痴乎
代码为剑,如痴如醉
  1. 首页
  2. 音视频
  3. 正文

avcodec_decode_video2解码得不到图像

2016年4月8日 1350点热度 6人点赞 0条评论

如下所示代码:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
while (av_read_frame(pFormatCtx, &packet) >= 0) {
// Is this a packet from the video stream?
if (packet.stream_index == videoStream) {
// Decode video frame
int iret = avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished, &packet);
 
// Did we get a video frame?
if (frameFinished) {
do something······
}
}
 
// Free the packet that was allocated by av_read_frame
av_packet_unref(&packet);
}

在使用avcodec_decode_video2函数解码时经常会遇到frameFinished == 0,也就是无法得到一帧解码后的图像。有些人可能会怀疑是哪里出错了,其实这是正常的现象,ffmpeg内部解码时做了处理。处理如下:

1)该帧为B帧,由于B帧是前后参考帧,需要结合前面的I帧或者P帧,以及后面的P帧来生成完整图像,所以该帧如果是B帧,就无法立即解码,所以返回的frameFinished为0,需要解码完后一帧后才可以解码该帧;

2)缓存处理,解码器解码时会缓存几帧提高程序的效率,防止程序在解码这一步等待太久。当解码到最后av_read_frame没有返回新的packet时,由于解码器存在缓存,所以最后我们需要清空解码器,通过传入空的packet给avcodec_decode_video2,直到没有新的解码后的frame返回这一方法来清空解码器。

本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可
标签: ffmpeg 音视频
最后更新:2016年4月8日

Jeff

管理员——代码为剑,如痴如醉

点赞
< 上一篇
下一篇 >

文章评论

取消回复

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据。

版权声明

为支持原创,创作更好的文章,未经许可,禁止任何形式的转载与抄袭,如需转载请邮件私信!本人保留所有法定权利。违者必究!

近期评论
  • Richard on WebRTC研究:Encoded Transform楼主你好,图片不见了,可以更新一下嘛?
  • flash91120 on Windows平台WebRTC编译-VS2017楼主,能不能出一期qt上使用webrtc…
  • damon on WebRTC音视频传输基础:NAT穿透太细了,看了眼我自己的笔记,果断直接删除…
  • k on Windows平台WebRTC编译(持续更新)麻烦问一下,我在src文件夹下,运行gn…
  • 小胖子 on WebRTC研究:Transport-cc之RTP及RTCP请教一个问题,在tcc的包里面的base…
相关文章
  • ffmpeg视频编码YUV与AVFrame对应关系
  • 安防视频播放秒开优化
  • mp4文件elst研究
  • 音视频开发入门:视频基础
  • 大话WebRTC

COPYRIGHT © 2022 jianchihu.net. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang