一.av_read_frame()

该函数用于读取具体的音/视频帧数据

int av_read_frame(AVFormatContext *s, AVPacket *pkt);

参数说明:

AVFormatContext *s   // 文件格式上下文

AVPacket *pkt      // 这个值不能传NULL,必须是一个空间,

            // 返回值:return 0 is OK, <0 on error or end of file

二.AVPacket

2.1 结构体常见参数说明

AVBufferRef buf;     // 指向一个buf空间,该空间是用来存储引用计数的。有可能多个AVPacket指向的都是这个buf的空间。因此要在每次拷贝的时候对其进行+1,删除的时候对其进行-1.

int64_t pts        // 显示时间。是一个long long 的类型。

int64_t des     // 解码时间。与上面一致,单位也是long long 类型。

uint8_t *data; int size // 指向的是AVBufferRef里面再分配的空间。该空间无法手动删除,因为是在动态库中创建的,需要调用FFmpeg提供的接口来删除。

2.2 相关函数说明

AVPacket *av_packet_alloc(void)         // AVPacket空间的创建和初始化。创建一个AVPacket对象,它会在堆上面申请空间,因此还需要去手动释放。

AVPacket *av_packet_clone(const AVPacket *src); // AVPacket空间的复制。创建并应用引用计数, 同时分配空间并增加引用计数。

int av_packet_ref(AVPacket *dst, const AVPacket *src); // 手动对AVPacket的引用计数+1

int av_packet_unref(AVPacket *pkt);  // 手动对AVPacket的引用计数-1

void av_packet_free(AVPacket **pkt); // 清空对象并减引用计数

void av_init_packet(AVPacket *pkt); // 初始化的一个接口,如果只是在栈中或者是new了一个对象,可以利用此函数进行初始化。

int av_packet_from_data(AVPacket *pkt, uint8_t *data, int size); // 分配空间的函数。如果创建了一个AVPacket,但还需要分配空间的话,可以调用该函数来分配空间。

int av_copy_packet(AVPacket *dst, const AVPacket *src); // 早期函数,已过期。不推荐使用。

三.av_seek_frame()

该函数可以将音/视频seek到指定的位置。

参数说明:

AVFormatContext *s // 封装格式上下文

int streamIndex    // 流的索引。默认值为-1,因为媒体文件中可能既包含视频又包含音频,可以通过streamIndex来指定究竟是以视频还是音频来移。

int64_t timestamp. // 时间戳。你要移动到哪个时间位置。

int flag       // 标识位。表示我们移动的策略(究竟是向前移,还是向后移)。

PS:av_seek_frame flag

#define AVSEEK_FLAG_BACKGROUND 1              ///<<Seek Background 往后移,

#define AVSEEK_FALG_BYTE         ///<<<seeking based on position in bytes 让时间戳
变成一个byte, 按照文件的大小位置跳到那个位置

#define AVSEEK_FLAG_ANY         ///<<<seek to any frame, even non-keyframes // 移动到任意帧的位置,不去找前面的关键帧,

#define AVSEEK_FLAG_FRAME        ///<<<seeking based on frame number // 找关键帧,一般与AVSEEK_FLAG_BACKGROUND一起使用

四.代码示例

// 读取一帧数据
AVPacket *packet = av_packet_alloc();
for (;;) {
int ret = av_read_frame(ic, packet);
if (ret != ) {
LOGI("读取到结尾处");
int pos = * r2d(ic->streams[videoStream]->time_base);
// 改变播放进度
av_seek_frame(ic, videoStream, pos, AVSEEK_FLAG_BACKWARD | AVSEEK_FLAG_FRAME);
continue;
}
LOGI("streamIndex=%d, size=%d, pts=%lld, flag=%d",
packet->stream_index,
packet->size,
packet->pts,
packet->flags
);
av_packet_unref(packet);
}

FFmpeg(7)-av_read_frame()读取帧数据AVPacket和av_seek_frame()改变播放进度的更多相关文章

  1. OpenGL读取帧缓存数据

    https://blog.csdn.net/niu2212035673/article/details/80251949 简述有些时候我们可能需要获取渲染后的图像数据,比较常用的函数是glReadPi ...

  2. JavaCV FFmpeg采集麦克风PCM音频数据

    前阵子用一个JavaCV的FFmpeg库实现了YUV视频数据地采集,同样的采集PCM音频数据也可以采用JavaCV的FFmpeg库. 传送门:JavaCV FFmpeg采集摄像头YUV数据 首先引入 ...

  3. (转)FFMPEG解码H264拼帧简解

    http://blog.csdn.net/ikevin/article/details/7649095 H264的I帧通常 0x00 0x00 0x00 0x01 0x67 开始,到下一个帧头开始之前 ...

  4. (转) 从ffmpeg中提取出YUV数据

    有时需要从ffmpeg中提取出YUV数据用作预览,另存什么的. ffmpeg是先解码成YUV, 再以这个YUV作为输入进行编码,所以YUV数据有两种:  解码后的YUV数据, 以及  编码重建的YUV ...

  5. java的poi技术读取Excel数据到MySQL

    这篇blog是介绍java中的poi技术读取Excel数据,然后保存到MySQL数据中. 你也可以在 : java的poi技术读取和导入Excel了解到写入Excel的方法信息 使用JXL技术可以在 ...

  6. Hive读取外表数据时跳过文件行首和行尾

    作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 有时候用hive读取外表数据时,比如csv这种类型的,需要跳过行首或者行尾一些和数据无关的或者自 ...

  7. 读取数据库数据,并将数据整合成3D饼图在jsp中显示

    首先我将生成饼图的方法独立写成一个PieChar.java类,详细代码如下:(数据库需要自己建,如有需要的话) import java.io.IOException; import java.sql. ...

  8. .NET读取Excel数据,提示错误:未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序

    解决.NET读取Excel数据时,提示错误:未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序的操作: 1. 检查本机是否安装Office Access,如果未安装去去h ...

  9. oledbdataadapter 读取excel数据时,有的单元格内容不能读出

    表现:excel中某列中,有的单元格左上角有绿色箭头标志,有的没有,c#编写读取程序,但是只能读取出带绿色箭头的单元格中的内容,其余不带的读取不到内容 原因:excel中单元格因为是文本格式而存储了数 ...

随机推荐

  1. Memcacher win7 安装测试

    1.下载memcache 的windows 稳定版,解压放某个盘下面,比如在H:/wamp/www/php api/memcache: 2.在终端(即cmd 命令界面)下,输入安装命令 :H:/wam ...

  2. linux上源码编译安装mysql-5.6.28

    在 linux 上编译安装 mysql-.tar.gz http://www.mysql.com/ mysql下载地址: http://www.mysql.com/downloads/mysql/#d ...

  3. Ubuntu 安装asciidoc时默认推荐了巨大的安装包

    $ sudo apt-get install asciidocReading package lists... DoneBuilding dependency tree       Reading s ...

  4. 解决linux的centos版本修改时间重启后无效的问题

    安装完centos后,发现时间与本地时间不匹配,在网上找了好多的办法,但是一直没有奏效,重启之后,又恢复为原来的时间.很是纳闷.最后抱着试一试的心态加上了这句指令: ln -sf /usr/share ...

  5. CreateThread与_beginthread, _beginthreadex创建线程的基本概念和区别

    这三个函数都可以创建新的线程,但都是如何创建的呢?当然MSDN文档最权威: Creates a thread to execute within the virtual address space o ...

  6. Word2Vec中文语料实战

    http://blog.csdn.net/gnehcuoz/article/details/52136371

  7. Windbg使用方法

    hgy413的专栏 http://blog.csdn.net/hgy413/article/category/1143065

  8. python IDE 集合

    python ruby等语言由于其小众和动态特性,缺少优良的IDE,本篇将介绍主要的python IDE. 1.python安装后自带有IDLE,简单方便,应该算是最简单的编辑环境了,但是过于简单,不 ...

  9. Maven for Eclipse 第三章 ——创建和导入 Maven 项目

    这一章主要介绍 Maven 项目的结构,它的构建的架构,主要涵盖了必需的主题,最后将学习如何创建一个简单的 Maven 项目.这章主要包括以下部分. Maven 项目的结构 POM 文件(Projec ...

  10. Eclipse Oxygen创建maven web项目(二)

    配置项目依赖库及第三方工具. 如示例的pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi ...