一.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. RHEL7-openldap安装配置二(客户端安装配置)

    LDAP用户登录流程: 当在客户端输入账号登录系统时,系统根据/etc/nsswitch.conf配置文件获取账号查找顺序,然后再根据PAM配置文件调用相关模块,对账号(/etc/passwd)及密码 ...

  2. Easyui入门视频教程 第11集---Window的使用

    目录 Easyui入门视频教程 第11集---Window的使用   Easyui入门视频教程 第10集---Messager的使用  Easyui入门视频教程 第09集---登录完善 图标自定义   ...

  3. JDBC连接方式有哪几种

    2011-05-10 目前比较常见的JDBC驱动程序可分为以下四个种类:  (1)JDBC-ODBC桥加ODBC驱动程序  JavaSoft桥产品利用ODBC驱动程序提供JDBC访问.注意,必须将OD ...

  4. iOS与H5交互

    H5与App原生交互,一般会是前端页面中的JavaScript与App使用的原生开发语言的交互.技术方案应能达到以下要求: 在js与原生进行交互的时候能保证正常的正向调用逻辑返回,反向可以处理异步回调 ...

  5. SpringBoot配置属性之Migration

    SpringBoot配置属性系列 SpringBoot配置属性之MVC SpringBoot配置属性之Server SpringBoot配置属性之DataSource SpringBoot配置属性之N ...

  6. 如何设置IIS程序池的回收时间,才能最大程度的减少对用户的影响?

    作为.Net开发人员,其实对IIS的应用程序池知之甚少,在工作中我也有几次遇到过网站无故打不开的情况,找了半天原因也找不到是怎么造成的,有一次我给网站找了一个程序程序池后发现就能正常访问了,这也让我对 ...

  7. JAXBContext处理CDATA

    今天做Lucene数据源接口时,遇到一个问题,就是输出xml时将某些数据放在CDATA区输出: 1.依赖的jar包,用maven管理项目的话, <dependency> <group ...

  8. ORA-14404: partitioned table contains partitions in a different tablespace

    SQL> drop tablespace nn_data including contents and datafiles; drop tablespace nn_data including ...

  9. Oracle 12C -- 网络性能调优

    1.传输数据压缩 网络性能主要受两方面影响:bandwidth和data volume. 在网络层对数据进行压缩,可以减少对网络带宽的需求.而且对应用是透明的. 如果是CPU是瓶颈时开启网络层数据压缩 ...

  10. 【BZOJ2395】【Balkan 2011】Timeismoney 最小乘积生成树

    链接: #include <stdio.h> int main() { puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢"); puts("网 ...