功能:
内存IO模式:avio_alloc_context():
自定义读写文件方式,打开文件
api
cpp
// 自定义IO
AVIOContext * avio_alloc_context (
unsigend char * buffer;
int buffer_size;
void *opaque;
int (*read_packet)(void * opaque, uint8_t * buf,int buf_size);
int (*write_packet)(void * opaque,uint8_t * buf, int buf_size);
int64_t (*seek)(void *opaque, int64_t offset, int whence));
)
opaque: 指向文件
buffer ⽤作FFmpeg输⼊时,由⽤户负责向 buffer 中填充数据,FFmpeg取⾛数据。
buffer ⽤作FFmpeg输出时,由FFmpeg负责向 buffer 中填充数据,⽤户取⾛数据。
write_flag是缓冲区读写标志,读写的主语是指FFmpeg。
write_flag 为1时, buffer ⽤于写,即作为FFmpeg输出。
write_flag 为0时, buffer ⽤于读,即作为FFmpeg输⼊。
read_packet和write_packet是函数指针,指向⽤户编写的回调函数。
seek也是函数指针,需要⽀持seek时使⽤。 可以类⽐fseek的机制
buffer_size > read_packet: buf_size
avio_alloc_context读取文件:
- 命令行输入:输入文件(mp3/aac)输出文件(pcm)
- 自定义IO : avdio_alloc_context
- 绑定自定义IO: avformate_open_input
code
avio_alloc_context读取文件:
cpp
static int read_packet(void *opaque,uint8_t *buf,int buf_size)
{
FILE *in_file = (FILE *)opaque;
int read_size = fread(buf,1,buf_size,in_file);
printf("read_packet read_size:%d,buf_size:%d\n",read_size,buf_size);
if(read.size <= 0)
return AVERROR_EOF;
return read_size;
}
int main()
{
FILE *in_file = NULL;
in_file = fopen(in_file_name, "rb");
// 自定义IO
uint8_t * io_buff = av_malloc(BUF_SIZE);
AVIOContext *avio_ctx = avio_alloc_context(io_buff,BUF_SIZE,0, (void *)in_file, read_packet, NULL);
AVFormatContext * format_ctx = avformat_alloc_context();
// struct AVFormatContext: 成员 AVIOContext *pb
AVIOContext *pb = avio_ctx;
avformat_open_input(&format_ctx,NULL,NULL,NULL);
}
avformat_alloc_context 读取文件:
cpp
AVFormatContext *format_ctx = avformat_alloc_context();
int ret = avformat_open_input(&format_ctx, in_file, NULL, NULL);