ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

FFmpeg学习:常用api——缓冲区队列相关

2022-07-20 11:36:14  阅读:204  来源: 互联网

标签:FFmpeg int void fifo api av 缓冲区 AVFifoBuffer size


时间戳相关API

时间基转换相关api

缓冲区队列相关api

视频(AVFifoBuffer:先进先出的循环缓冲)

1、结构体定义

typedef struct AVFifoBuffer {
    uint8_t *buffer;
    uint8_t *rptr, *wptr, *end;
    uint32_t rndx, wndx;
} AVFifoBuffer;

2、申请fifo

/*
*分配单个size大小的fifo,其内部调用av_fifo_alloc_array(size, 1),失败返回NULL
*/
AVFifoBuffer *av_fifo_alloc(unsigned int size);
 
/*
*分配nmemb个大小为size的空间,失败返回NULL
*/
AVFifoBuffer *av_fifo_alloc_array(size_t nmemb, size_t size);

3、释放fifo

/*
*释放fifo
*/
void av_fifo_free(AVFifoBuffer *f);
 
/*
*释放fifo,并且将f置为NULL
*/
void av_fifo_freep(AVFifoBuffer **f);

4、重置fifo

/*
*重置fifo
*/
void av_fifo_reset(AVFifoBuffer *f);

5、获取fifo内部数据大小

/*
*以字节数的方式返回当前在AVFifoBuffer中数据的大小,
*也就是你可以从当前AVFifoBuffer中读取数据的长度
*/
int av_fifo_size(const AVFifoBuffer *f);

6、获取fifo剩余容量

/*
*以字节数的方式返回当前AVFifoBuffer中剩余的容量,也就是你可以写入的内容的大小
*/
int av_fifo_space(const AVFifoBuffer *f);

7、读取fifo中的内容,(非丢弃方式,也就是不会将fifo中对应的数据擦除)

/*
*从当前AVFifoBuffer中的rptr += offset位置读取buf_size长度的数据到dest中;
*可以自定义读取函数,若没有自定义函数,则使用memcpy进行拷贝
*/
int av_fifo_generic_peek_at(AVFifoBuffer *f, 
                            void *dest, 
                            int offset, 
                            int buf_size, 
                            void (*func)(void*, void*, int));
 
/*
*从当前AVFifoBuffer中读取buf_size长度的数据到dest中;
*可以自定义读取函数
*/
int av_fifo_generic_peek(AVFifoBuffer *f, 
                         void *dest, 
                         int buf_size, 
                         void (*func)(void*, void*, int));

8、读取fifo中的内容,(丢弃方式)

/*
*从AVFifoBuffe中读取buf_size长度的数据到dest中
*/
int av_fifo_generic_read(AVFifoBuffer *f, 
                         void *dest, 
                         int buf_size, 
                         void (*func)(void*, void*, int));

9、写数据到fifo中

/*
*写size字节的数据到AVFifoBuffer中
*/
int av_fifo_generic_write(AVFifoBuffer *f, 
                          void *src, 
                          int size, 
                          int (*func)(void*, void*, int));

10、重置fifo大小

int av_fifo_realloc2(AVFifoBuffer *f, unsigned int size);

11、增加fifo大小

int av_fifo_grow(AVFifoBuffer *f, unsigned int additional_space);

12、删除fifo中固定长度的内容

void av_fifo_drain(AVFifoBuffer *f, int size);

音频(AVAudioFifo)

AVAudioFifo是FFmpeg提供的一个先入先出的音频缓冲队列。主要要以下几个特点:

  • 操作在样本级别而不是字节级别。
  • 支持多通道的格式,不管是planar还是packed类型。
  • 当写入一个已满的buffer时会自动重新分配内存。

av_audio_fifo_alloc(): 根据采样格式、通道数和样本个数创建一个AVAudioFifo。
av_audio_fifo_realloc():根据新的样本个数为AVAudioFifo重新分配空间。
av_audio_fifo_write(): 将数据写入AVAudioFifo。如果可用的空间小于传入nb_samples参数AVAudioFifo将自动重新分配空间。
av_audio_fifo_size(): 获取当前AVAudioFifo中可供读取的样本数量。
av_audio_fifo_read():从AVAudioFifo读取数据。

参考

AVFifo
AVAudioFifo

标签:FFmpeg,int,void,fifo,api,av,缓冲区,AVFifoBuffer,size
来源: https://www.cnblogs.com/zjacky/p/16497245.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有