FFmepg--内存IO模式

功能:

内存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读取文件:
  1. 命令行输入:输入文件(mp3/aac)输出文件(pcm)
  2. 自定义IO : avdio_alloc_context
  3. 绑定自定义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);
相关推荐
aqi002 小时前
FFmpeg开发笔记(七十二)Linux给FFmpeg集成MPEG-5视频编解码器EVC
android·ffmpeg·音视频·流媒体
不太会编程的IT男1 天前
在 Jetson Orin 开发套件上使用 Hardware Encoder / Decoder 构建 FFmpeg
ffmpeg·视频编解码·h.264
m0_687399841 天前
写一个Ununtu C++ 程序,调用ffmpeg API, 来判断一个数字电影的视频文件mxf 是不是Jpeg2000?
开发语言·c++·ffmpeg
aqi001 天前
FFmpeg开发笔记(七十一)使用国产的QPlayer2实现双播放器观看视频
android·ffmpeg·音视频·流媒体
Java患者·1 天前
【小白】linux安装ffmpeg | java转码 【超详细】
ffmpeg
suifen_1 天前
RK平台ffmpeg支持硬件编解码
ffmpeg
feiyangqingyun1 天前
全网唯一/Qt结合ffmpeg实现手机端采集摄像头推流到rtsp或rtmp/可切换前置后置摄像头/指定分辨率帧率
qt·智能手机·ffmpeg
melonbo2 天前
使用FFmpeg将H.264码流封装为MP4
ffmpeg·音视频·h.264
aqi002 天前
FFmpeg开发笔记(七十七)Android的开源音视频剪辑框架RxFFmpeg
android·ffmpeg·音视频·流媒体
慢行的骑兵2 天前
Android音视频探索之旅 | CMake基础语法 && 创建支持Ffmpeg的Android项目
ffmpeg·音视频