• 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));
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    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读取文件:
    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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    avformat_alloc_context 读取文件:
    
    	AVFormatContext *format_ctx = avformat_alloc_context();
    	
    	int ret = avformat_open_input(&format_ctx, in_file, NULL, NULL);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    YOLOv7改进:极简的神经网络模型 VanillaNet---VanillaBlock助力检测,实现暴力涨点 | 华为诺亚2023
    Java学习笔记5.2.1 List接口 - ArrayList类
    docker入门
    Picasso学习
    「数据结构详解·一」树的初步
    STC51单片机31——红外遥控收发代码
    Fe3O4纳米粒子/氧化锌纳米粒子/纳米氧化铈/纳米聚乙烯修饰二氧化硅微球表征探究
    C++ vector容器的介绍与使用
    【大学复健】两种质朴的素数筛法
    java计算机毕业设计springboot+vue专业手语翻译预约系统
  • 原文地址:https://blog.csdn.net/qq_43538607/article/details/136234192