0


FFmepg--内存IO模式

功能:

内存IO模式:avio_alloc_context():
自定义读写文件方式,打开文件

api

// 自定义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读取文件:
  1. 命令行输入:输入文件(mp3/aac)输出文件(pcm)
  2. 自定义IO : avdio_alloc_context
  3. 绑定自定义IO: avformate_open_input

code

avio_alloc_context读取文件:
staticintread_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;}intmain(){
    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 读取文件:

    AVFormatContext *format_ctx =avformat_alloc_context();int ret =avformat_open_input(&format_ctx, in_file,NULL,NULL);
标签: ffmpeg

本文转载自: https://blog.csdn.net/qq_43538607/article/details/136234192
版权归原作者 八月的雨季997 所有, 如有侵权,请联系我们删除。

“FFmepg--内存IO模式”的评论:

还没有评论