FFmpeg之AVPacket
花满楼原创
AVPacket,是压缩数据的结构体(解码前或编码后的结构体)。
本文介绍FFmepg中常见结构AVPacekt,尽量用具体值来理解。
整个用于调试的代码可以这样写:
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
void show_frame(const char* filepath) {
av_register_all();
av_log_set_level(AV_LOG_DEBUG);
AVFormatContext* formatContext = avformat_alloc_context();
int status = 0;
int success = 0;
int videostreamidx = -1;
AVCodecContext* codecContext = NULL;
status = avformat_open_input(&formatContext, filepath, NULL, NULL);
if (status == 0) {
status = avformat_find_stream_info(formatContext, NULL);
if (status >= 0) {
for (int i = 0; i < formatContext->nb_streams; i ++) {
if (formatContext->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
videostreamidx = i;
break;
}
}
if (videostreamidx > -1) {
AVStream* avstream = formatContext->streams[videostreamidx];
codecContext = avstream->codec;
AVCodec* codec = avcodec_find_decoder(codecContext->codec_id);
if (codec) {
status = avcodec_open2(codecContext, codec, NULL);
if (status == 0) {
success = 1;
}
}
}
}
else {
av_log(NULL, AV_LOG_DEBUG, "avformat_find_stream_info error\n");
}
if (success) {
av_dump_format(formatContext, 0, filepath, 0);
int gotframe = 0;
AVFrame* frame = av_frame_alloc();
int decodelen = 0;
int limitcount = 10;
int pcindex = 0;
while (pcindex < limitcount) {
AVPacket packet;
av_init_packet( &packet );
status = av_read_frame(formatContext, &packet);
if (status < 0) {
if (status == AVERROR_EOF) {
av_log(NULL, AV_LOG_DEBUG, "read end for file\n");
}
else {
av_log(NULL, AV_LOG_DEBUG, "av_read_frame error\n");
}
av_packet_unref(&packet);
break;
}
else {
if (packet.stream_index == videostreamidx) {
decodelen = avcodec_decode_video2(codecContext, frame, &gotframe, &packet);
if (decodelen > 0 && gotframe) {
av_log(NULL, AV_LOG_DEBUG, "got one avframe, pcindex=%d\n", pcindex);
}
}
}
av_packet_unref(&packet);
pcindex ++;
}
av_frame_free(&frame);
}
avformat_close_input(&formatContext);
}
avformat_free_context(formatContext);
}
int main(int argc, char *argv[])
{
show_frame("moments.mp4");
return 0;
}
av_read_frame函数可以取得一个AVPacket,所以在调用这个函数的地方下个断点,看一下AVPacet长什么样子。
编译脚本还是沿用之前介绍的makefile或直接用gcc来编译。
在没有调用av_read_frame前,AVPacket中的变量值:
调用av_read_frame后,AVPacket中的变量:
再一次av_read_frame后:
av_read_frame后,AVPacket也可能没有数据:
AVPacket是压缩数据,一个AVPacket,对于视频最多一帧(NALU),但对于音频就可能多帧。
AVPacket中的变量含义:
pts/dts,显示/解码时间戵,以packet所在的流的time_base为单位。
stream_index,所在流的索引。
data,avpacket拥有的数据。
size,avpacket的数据长度。
duration,avpacket的时长,同样以time_base为单位。
AVPacket结构,在libavcodec/avcodec.h中定义。
FFmpeg之AVPacket的更多相关文章
- FFmpeg 中AVPacket的使用
AVPacket保存的是解码前的数据,也就是压缩后的数据.该结构本身不直接包含数据,其有一个指向数据域的指针,FFmpeg中很多的数据结构都使用这种方法来管理数据. AVPacket的使用通常离不开下 ...
- FFmpeg数据结构AVPacket
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10410320.html 本文基于FFmpeg 4.1版本. 1. 数据结构定义 stru ...
- C/C++音视频库ffmpeg的数据包AVPacket分析
ffmpeg下载地址 http://www.ffmpeg.club/ AVPacket是ffmpeg用来存放编码后的视频帧数据,我们来分析一下这个结构体,先贴出ffmpeg3.2中AVPacket声明 ...
- FFmpeg详解
认识FFMPEG FFMPEG堪称自由软件中最完备的一套多媒体支持库,它几乎实现了所有当下常见的数据封装格式.多媒体传输协议以及音视频编解码器.因此,对于从事多媒体技术开发的工程师来说,深入研究FFM ...
- 最新FFMPEG解码流程
FFMPEG解码流程: 1. 注册所有容器格式和CODEC: av_register_all() 2. 打开文件: av_open_input_file() 3 ...
- (转)FFMPEG解码H264拼帧简解
http://blog.csdn.net/ikevin/article/details/7649095 H264的I帧通常 0x00 0x00 0x00 0x01 0x67 开始,到下一个帧头开始之前 ...
- FFmpeg基础一
来源:http://blog.csdn.net/chance_yin/article/details/10323441 一.研究数字多媒体,首先要了解几个基本术语(ffmpeg的相关文档几乎都是英文的 ...
- ffmpeg 详解
来源:http://blog.itpub.net/9399028/viewspace-1242300/ FFMPEG详解 认识FFMPEG FFMPEG堪称自由软件中最完备的一套多媒体支持库,它几 ...
- 【FFMPEG】I,P,B帧和PTS,DTS时间戳的关系
FFmpeg里有两种时间戳:DTS(Decoding Time Stamp)和PTS(Presentation Time Stamp). 顾名思义,前者是解码的时间,后者是显示的时间.要仔细理解这两个 ...
随机推荐
- 2017年最受欢迎的UI框架
前端领域最近几年发展的特别迅速,可以说是百家争鸣.在底层的前端框架领域中,最早是jquery称霸互联网,近两年MVVM类型的框架慢慢成为主流,Vue.React和Angular三大框架并驾齐驱.可以说 ...
- $(window).on("load",function(){} 和 $(document).ready(function() {}
$(window).on("load",function(){ //页面属性,图片,内容完全加载完,执行 } $(document).ready(function() { 或者$( ...
- [Bayesian] “我是bayesian我怕谁”系列 - Naive Bayes+prior
先明确一些潜规则: 机器学习是个collection or set of models,一切实践性强的模型都会被归纳到这个领域,没有严格的定义,’有用‘可能就是唯一的共性. 机器学习大概分为三个领域: ...
- cmd 编译java WebService
格式:wsimport -s "src目录" -p "生成类所在包名" -keep "wsdl发布地址" 示例: wsimport -s G ...
- 在Javaava中stringBuilder的用法
String对象是不可改变的.每次使用 System.String类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间.在需要对字符串执行重复修改的情况下,与创建新的 ...
- Vue源码终笔-VNode更新与diff算法初探
写完这个就差不多了,准备干新项目了. 确实挺不擅长写东西,感觉都是罗列代码写点注释的感觉,这篇就简单阐述一下数据变动时DOM是如何更新的,主要讲解下其中的diff算法. 先来个正常的html模板: & ...
- mysql服务处理流程
先把错误日志定位 就是找的错误日志 然后必要的时候 重新启动服务器 排除其他的干扰 把错误日志 挪到旧文件 清空错误日志 然后试着启动 看干净的错误日志 然后 问题就解决了
- 2015-2016 ACM-ICPC, NEERC, Southern Subregional Contest J Cleaner Robot
Cleaner RobotCrawling in process... Crawling failed Time Limit:2000MS Memory Limit:524288KB ...
- XML之外部DTD和内部DTD
DTD(Document Type Definition):文档类型定义,可以定义合法的XML文档结构,它使用一系列合法元素来定义文档的结构.DTD分为内部DTD和外部DTD,所谓内部DTD是指该DT ...
- 解析 C# 7中的元组类型(ValueTuple)
System.Tuple 类型是在.NET 4.0中引入的,但是有两个明显的缺点: (1) Tuple 类型是引用类型. (2) 没有构造函数支持. 为了解决这些问题,C# 7 引入了新的语言功能以及 ...