C/C++音视频库ffmpeg的数据包AVPacket分析

ffmpeg下载地址 http://www.ffmpeg.club/

AVPacket是ffmpeg用来存放编码后的视频帧数据,我们来分析一下这个结构体,先贴出ffmpeg3.2中AVPacket声明的源代码:

typedef struct AVPacket {
/**
* A reference to the reference-counted buffer where the packet data is
* stored.
* May be NULL, then the packet data is not reference-counted.
*/
AVBufferRef *buf;
/**
* Presentation timestamp in AVStream->time_base units; the time at which
* the decompressed packet will be presented to the user.
* Can be AV_NOPTS_VALUE if it is not stored in the file.
* pts MUST be larger or equal to dts as presentation cannot happen before
* decompression, unless one wants to view hex dumps. Some formats misuse
* the terms dts and pts/cts to mean something different. Such timestamps
* must be converted to true pts/dts before they are stored in AVPacket.
*/
int64_t pts;
/**
* Decompression timestamp in AVStream->time_base units; the time at which
* the packet is decompressed.
* Can be AV_NOPTS_VALUE if it is not stored in the file.
*/
int64_t dts;
uint8_t *data;
int size;
int stream_index;
/**
* A combination of AV_PKT_FLAG values
*/
int flags;
/**
* Additional packet data that can be provided by the container.
* Packet can contain several types of side information.
*/
AVPacketSideData *side_data;
int side_data_elems;

/**
* Duration of this packet in AVStream->time_base units, 0 if unknown.
* Equals next_pts - this_pts in presentation order.
*/
int64_t duration;

int64_t pos; ///< byte position in stream, -1 if unknown

#if FF_API_CONVERGENCE_DURATION
/**
* @deprecated Same as the duration field, but as int64_t. This was required
* for Matroska subtitles, whose duration values could overflow when the
* duration field was still an int.
*/
attribute_deprecated
int64_t convergence_duration;
#endif
} AVPacket;

我们依次进行分析

AVBufferRef *buf;

用来存放引用计数的数据,如果没有使用引用计数,值就是NULL,当你多个packet对象引用同一帧数据的时候用到。

int64_t pts;

本帧数据显示的时间,比较关键的数据,在做seek和播放进度的时候都要用到它,pts只是一个数量,对应于AVStream->time_base,要根据time_base才能转换为具体的时间,音频和视频一般有不同的time_base,所以在做音视频同步一定要做转换,不能直接拿pts做。

转换方式,比如转为毫秒

AVFormatContext *ic = NULL;

static double r2d(AVRational r)

{

return r.num == 0 || r.den == 0 ? 0. : (double)r.num / (double)r.den;

}

//。。。

int pts = (pkt->pts *r2d(ic->streams[pkt->stream_index]->time_base)) * 1000;

int64_t dts;

基本属性等同于pts,区别就是dts对应的是解码时间不是显示时间,解码后会放入缓冲,比如h264,如果有b帧,则要先解码后面的b帧,再解码之前的帧。

uint8_t *data; int size;

帧的数据和数据大小

int stream_index;

帧数据所属流的索引,用来区分音频,视频,和字幕数据。

int flags;

标志,其中为1表示该数据是一个关键帧

AV_PKT_FLAG_KEY 0x0001 关键帧

AVPacketSideData *side_data;

int side_data_elems;

容器提供的一些附加数据

int64_t duration;

下一帧pts - 当前帧pts ,也就表示两帧时间间隔。

int64_t pos;

当前帧数据在文件中的位置(字节为单位),如果做文件移位用到,如果rtsp就没有此数据。

更多的资料也可以关注我的视频课程

夏曹俊老师课程专栏http://edu.csdn.net/lecturer/961

手把手教您开发视频播放器

http://edu.csdn.net/course/detail/3300

时间: 2025-02-01 14:41:02

C/C++音视频库ffmpeg的数据包AVPacket分析的相关文章

音视频框架ffmpeg源码的简要分析

感谢http://m.2cto.com/kf/201201/116171.html这里一系列的文章 最新版的ffmpeg中发现了一个新的东西:avconv,而且ffmpeg.c与avconv.c一个模样,一研究才发现是libav下把ffmpeg改名为avconv了. 到底libav与ffmpeg现在是什么个关系?我也搞得希里糊涂的,先不管它了. ffmpeg的主要功能是音视频的转换和处理.其功能之强大已经到了匪夷所思的地步(有点替它吹了).它的主要特点是能做到把多个输入文件中的任意几个流重新组合

C++编程音视频库ffmpeg的pts时间换算方法

ffmpeg中的pts,dts,duration时间记录都是基于timebase换算,我们主要分析下pts的时间怎么换算,其它的是一样的换算.ffmpeg的时间换算对许多新接触同学算是一个大坑,很多刚接触ffmpeg的同学都不容易搞清楚它的时间计算方法. 我们先看下ffmpeg时间是怎么算的: 一帧图像(音频)的时间戳(时间戳一般以第一帧为0开始)= pts * (AVRational.num/AVRational.den) 为什么要这么算(挖坑)我们看下ffmpeg的说明: "当有理数用浮点数

音视频开发-FFmpeg

音视频开发是个非常复杂的,庞大的开发话题,初涉其中,先看一下结合 OEIP(开源项目) 新增例子. 可以打开flv,mp4类型文件,以及rtmp协议音视频数据,声音的播放使用SDL. 把采集的麦/声卡数据混合并与采集的视频信息写入媒体文件或是RMTP协议中. 图片主要属性 包含长/宽/通道数/像素格式(U8/U16/F32),以及排列格式RGBA/YUV.其中通道与像素格式,如在opencv中,CV_8UC1/CV_8UC4,表示1个通道与4个通道的U8格式.而排列格式,简单的分为RGBA类的,

音视频之ffmpeg时间基

FFmpeg中有个比较重要的概念就是时间基. ffmpeg本身有个时间基,视频输入流有时间基,输出流有时间基,音频也是相同道理. 主要的目的是方便他们自己内部计算. 我们先拿视频播放器来举例,其中要对时间进行处理的是视频的时间,音频的时间,然后两者要进行同步. 我们先看timebase的结构体: 这就是一个分数 我们播放一个视频打印日志发现 视频的时间基是1/12800,这个12800怎么算出来的我是真不知道 音频时间基是1/48000,这个还好理解,音频采样率就是48000,也就是一秒钟采样4

音视频处理之采样数据20180223

一.视频像素数据 1.最为常用的是YUV420,YUV格式像素数据查看工具yuv player,如下图: ps:BMP文件中存储的就是RGB格式的像素数据. 2.YUV格式简介 相关实验表明,人眼堆亮度铭感但对色度不敏感.所以可以将亮度信息和色度信息分离, 并堆色度信息采用更狠一点的压缩方案,从而提高压缩效率.也就是说YUV格式的像素数据 也是压缩的. 1).YUV格式中,Y只包含亮度信息,而UV只包含色度信息. 2).以YUV420P为例,首先存储了整张图像的Y信息,然后存储整张图像的U信息(

FFmpeg音视频核心技术精讲与实战

第1章 课程导学与准备工作全民娱乐时代,需要音视频等多媒体产品层出不穷,但会处理音视频数据的工程师却极度匮乏,进入音视频开发领域正当时,这门课程就是为这样的你而生.来吧!加入我们,成就更好的自己.1-1 课前必读(不看会错过一个亿)1-2 课程导学1-3 音视频的应用范围与播放器架构讲解(选看)1-4 什么是ffmpeg?它能做什么?(选看)1-5 ffmpeg下载,编译与安装1-6 Windows下安装 FFmpeg1-7 ffmpeg命令大全文档 第2章 FFmpeg常用命令实战本章讲解如何

音视频即时通讯 功能需求汇总

即时通讯开发,也叫音视频即时通信开发.随着互联网的发展,人们之间的交流逐步从电话移向网络.每天都有相当多的人在使用各种网络交流工具,如Anychat,腾讯QQ,ICQ,MSN,新浪微博. 可以看出人们对于网络上即时的沟通方式是非常敏锐的,所能容纳的程度也远远超过我们的预计.然而目前大部分网络交流工具都还是以文字为主,语音视频功能大部分还是不够成熟,完全通过网络实现语音视频需要考虑到很多方面,如:硬件.软件.技术.网络:等等.纯文字沟通方式效率非常低而且也不符合人们平素的习惯,作为一种消遣的工具尚

Android IOS WebRTC 音视频开发总结(八十五)-- 使用WebRTC广播网络摄像头视频(下)

本文主要介绍WebRTC (我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:blackerteam 或 webrtcorgcn). 回顾:Android IOS WebRTC 音视频开发总结(八十三)-- 使用WebRTC广播网络摄像头视频(上) 连接网络摄像头 正如上文所提,我们选用一款简单的D-Link DCS-7010L网络摄像头.关键原因在于它支持RTSP协议,因此服务

跨平台的即时通讯音视频解决方案

改变你视界的AnyChat,通过封装音视频编解码.流媒体处理以及P2P等专业复杂技术,为上层应用提供简单的API控制接口,实现一对一.一对多的实时音视频交互.文件传输.透明通道.音视频录制等功能.在移动互联网.物联网.在线教育.远程医疗.视频客服以及智能家居等业务领域拥有广泛的应用空间. 产品核心竞争力 一.音视频通信 承载数千客户的多形态音视频通信应用,近十年技术积累值得信赖,AnyChat将为您提供专业卓越的跨平台音视频通信服务体验.采用和优化H.264视频编解码,AAC音频编码标准与P2P