gpt4 book ai didi

C 中 ffmpeg 的自定义实时输入

转载 作者:行者123 更新时间:2023-11-30 16:58:24 25 4
gpt4 key购买 nike

我正在使用 avformat_alloc_context 和 avio_alloc_context 实现自定义 io,以便能够实时读取另一个函数的输出。此函数在 boost asio 线程中填充缓冲区,而 ffmpeg 则从另一个线程读取此缓冲区。

我初始化一个 io 缓冲区,该函数将写入该缓冲区,ffmpeg 会读取该缓冲区:

BufferData input_buffer = {0};
input_buffer.size = 65536;
input_buffer.ptr = (uint8_t *) av_malloc(buf_size);
memset(input_buffer.ptr,'0',100);

fprintf(stdout, "initialisation: buffer pointer %p buffer data pointer: %p\n", &input_buffer, input_buffer.ptr);

为什么我要做memset is explained here 。然后测试我所做的指针地址:

BufferData * decode_buffer;
decode_buffer->size = 65536;
decode_buffer->ptr = (uint8_t *) av_malloc(decode_buffer->size);

AVIOContext * av_io_ctx = avio_alloc_context(decode_buffer->ptr, decode_buffer->size, 0, &input_buffer, &read_function, NULL, NULL);

AVFormatContext *av_fmt_ctx = avformat_alloc_context();
av_fmt_ctx->pb = av_io_ctx;


BufferData * tmpPtr = (BufferData * ) video_input_file->av_io_ctx->opaque;

fprintf(stdout, "video decoder before: buffer pointer %p, buffer data pointer: %p\n", tmpPtr, tmpPtr->ptr);

open_res = avformat_open_input(&av_fmt_ctx, "anyname", in_fmt, options ? &options : NULL);

fprintf(stdout, "video decoder after: buffer pointer %p, buffer data pointer: %p\n", tmpPtr, tmpPtr->ptr);

供引用

typedef struct {
uint8_t *ptr;
size_t size;
} BufferData;

读取函数

static int read_function(void* opaque, uint8_t* buf, int buf_size) {
BufferData *bd = (BufferData *) opaque;
buf_size = FFMIN(buf_size, bd->size);
memcpy(buf, bd->ptr, buf_size);
bd->ptr += buf_size; //This seemed to cause the problem
bd->size -= buf_size;
return buf_size;
}

结果将是:

initialisation: buffer pointer 0x7f2c4a613620, buffer data pointer: 0x7f2c48c56040

video decoder before: buffer pointer 0x7f2c4a613620, buffer data pointer: 0x7f2c48c56040

video decoder after: buffer pointer 0x7f2c4a613620, buffer data pointer: 0x7f2c49e24b50

缓冲区数据ptr被avformat_open_input改变是正常行为吗?因为我想保留初始指针地址,因为我在另一个函数中使用它,并为其分配了所需的内存。

最佳答案

这与我的读取功能有关,与 avformat_open_input 无关。我在指针上写的是 per described here (参见 read_packet 函数)。经过更多思考后,是的,考虑到读取函数应该将指针增加到下一帧的开头,所以这样做是有意义的。

关于C 中 ffmpeg 的自定义实时输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38864119/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com