live555+ffmpeg如何提取关键帧(I帧,P帧,B帧)
开发流媒体播放器的时候,特别是在windows  mobile,symbian(S60)平台开发时,很可能遇到需要自己开发播放器的情况。
S60平台提供了CVideoPlayUtility接口可以实现流媒体播放器,但由于非开源,所以相对于自己开发播放器,很多操作受到限制。
live555主要用于网络流接收,ffmpeg则是对接收到的数据进行编码/解码。I帧,P帧,B帧是视频流中三种分类,其中I帧也就是关键帧
是基础帧,P帧一般根据I帧确定,而B帧需要前面两着的信息。
举例说:

the Input sequence for video encoder
1  2   3   4   5    6   7
I    B   B   P  B   B   I

Let's take 1,2,3.. as PTS for simplification

the out sequence for video encoder ( this equals the decoder sequence)
1  4   2    3   7   5   6
I   P    B   B   I    B   B

播放器LIVE555收到的序列顺序就应该是:

1  4  2  3  7  5  6

经过解码器解码,顺序又回到1 2 3 4 5 6 7这种正常顺序。

所以我们可以根据avcodec_decode_video来判断帧别。
avcodec_decode_video之后的顺序是一定的。严格按照1 2 3 4。。。这样的顺序来。
判断I帧,P,B帧方法:
(1):假如解码成功,则不是I帧就是P帧(根据AVFrame->keyframe判断是否是I帧)。
假如不是I帧,也不是P帧,则只能是B帧(通过pts判断)。
(2):采用AVFrame->pict_type综合pts的办法:
if(FF_I_TYPE==picture->pict_type)
                        {
                                Printlog("<II>");
                        }
                        else if(FF_P_TYPE==picture->pict_type)
                        {
                                Printlog("<PP>");
                        }
                        else if(FF_B_TYPE==picture->pict_type)
                        {
                                Printlog("<BB>");
                        }
                        else if(FF_S_TYPE==picture->pict_type)
                        {
                                Printlog("<SS>");
                        }
                        else
                        {
                                Printlog("<OtherType>");
                        }
正常情况下是不会打印出B帧的,因为解码成功的肯定是I帧或者是P帧.

转自:http://blog.csdn.net/linzhiji/article/details/5393647

live555+ffmpeg如何提取关键帧(I帧,P帧,B帧)的更多相关文章

  1. 基于Live555,ffmpeg的RTSP播放器直播与点播

    基于Live555,ffmpeg的RTSP播放器直播与点播 多路RTSP高清视频播放器下载地址:http://download.csdn.net/detail/u011352914/6604437多路 ...

  2. 程序员的脑袋系列---利用ffmpeg命令提取音频

    今日各大播放器的版权控制越来越严格.导致很多歌曲无法听,但是MV却可以听.这样很蛋疼有木有? 然而,我们可以利用ffmpeg工具提取MV的音频,比如做成MP3格式,这样就可以听了.--哈哈(邪恶地笑) ...

  3. 二、Mp3帧分析(标签帧)

    Mp3文件由帧组成,帧分成标签帧和数据帧,本文就Mp3文件的帧进行分析. 一.标签帧 MP3帧头中除了存储一些象private.copyright.original的简单音乐说明信息以外,没有考虑存放 ...

  4. hostapd修改beacon帧和probe response帧

    在AP模式下,热点会不断定期地发送Beacon帧来宣告自己存在,告知设备可以加入网络: Probe Response帧是用于应答Probe Request帧,Probe Request帧是移动工作站用 ...

  5. CAN编写完分帧发送, 分帧接收,J1939位域型结构体心得

    关于由多个不同的C文件构成的工程,我采用以下方法 以为400Hz数字电源程序为例 假设工程由以下文件组成 DC_Comm.c 主要完成串口通讯部分 DC_Config.c 主要完成时钟,外设 中断初始 ...

  6. C++调用ffmpeg.exe提取视频帧

    有时候,我们获得一段视频,需要将其中的每一帧都提取出来,来进行一些相关的处理,这时候我们就可以需要用到ffmpeg.exe来进行视频帧的提取. ffmpeg简介:FFmpeg是一套可以用来记录.转换数 ...

  7. Windows下 ffmpeg + labelImg 提取视频帧 得到图片集 并 标注图片 来 构造数据集

    构造数据集的流程 视频文件  >>  ffmpeg处理  >>  图片集  >>  labelImg进行标注  >>  标注好的数据集 准备ffmpeg ...

  8. ffmpeg,X264编码结果I帧QP比P帧还大

    enc_ctx->profile =FF_PROFILE_H264_MAIN ; enc_ctx->time_base.den = 24; enc_ctx->time_base.nu ...

  9. 【HEVC】2、HM-16.7编码一个CU(帧内部分) 1.帧内预测相邻参考像素获取

    HEVC帧内预测的35中预测模式是在PU基础上定义的,实际帧内预测的过程则以TU为单位.PU以四叉树划分TU,一个PU内所有TU共享同一种预测模式.帧内预测分3个步骤: (1) 判断当前TU相邻像素点 ...

随机推荐

  1. python 模拟用户登录代码

    需求:输入用户名,判断用户是否被锁定,锁定则退出,否则进入密码验证,输入三次错误密码之后此用户被锁定. userlist.txt里,用":"将用户名.密码.状态码分开: [root ...

  2. Codeforces Round #167 (Div. 2)

    C. Dima and Staircase 线段树维护区间最大值. D. Dima and Two Sequences 由于模数不一定为质数,所以通过拆分质因数来做阶乘取模. E. Dima and ...

  3. pthread_cond_wait()函数的理解(摘录)

    /************pthread_cond_wait()的使用方法**********/pthread_mutex_lock(&qlock);    /*lock*/pthread_c ...

  4. bzoj1188 [HNOI2007]分裂游戏 博弈论 sg函数的应用

    1188: [HNOI2007]分裂游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 973  Solved: 599[Submit][Status ...

  5. windows2003 DHCP中批处理绑定IP与MAC

    最近正在实施Windows Server 2008 R2 DHCP服务器部署,要求把员工的IP地址和MAC以及姓名完成在DHCP服务器上的绑定,使用的系统是windows2003-x64,要添加的用户 ...

  6. Businessworks的设计思想

    Businessworks的设计思想基于一下三篇ATA: <从Eclipse平台看交易平台化>,强调微内核和扩展机制实现 <Google Guice平台模块化开发的果汁>,讨论 ...

  7. PHP list,explode的使用

    PHP list,explode的使用 <?php header("Content-type: text/html; charset=utf-8"); echo " ...

  8. CentOS MySQL 配置

    问题: MySQL安装后root用户无法连接,提示 ERROR 1045 (28000): Access denied for user ’root’@’localhost’ (using passw ...

  9. [Linux] - Docker移动数据到其它盘的办法

    由于使用yum安装Docker,默认是数据是存放在系统盘/var/lib目录下,需要把它放到其实盘里头.方法可以这样做: 1.在其它盘中新建一个目录,比如我的:/yunpan/docker mkdir ...

  10. 【python】遍历类的所有成员

    # -*- coding: utf-8 -*- #sharejs.com提供代码,转载请注明出处 class Site(object): def __init__(self): self.title ...