通过从内存而不是磁盘读取和解码 mpeg2 数据来使用 libmpeg2

libmpeg2 use by reading and decoding mpeg2 data from memory instead of disk

我尝试在我的程序中使用 libmpeg2 库。随库提供的mpeg2dec示例使用电脑磁盘上的mpeg文件播放mpeg2

我想改用内存中的数据(存储在内存中的无符号字符数组)。这是我想修改的函数的详细信息:

static void es_loop (unsigned char * data10r, unsigned int * size10r)

{
    buffer_size = 4096;

    uint8_t * buffer = (uint8_t *) malloc (buffer_size);
    uint8_t * end;

    if (buffer == NULL)
        exit (1);

    do {

        end = buffer + fread (buffer, 1, buffer_size, in_file);
        decode_mpeg2 (buffer, end);

    } while (end == buffer + buffer_size && !sigint);
    free (buffer);

}

其中 data10r 是一个无符号字符数组,包含内存中的 mpeg2 数据,大小为 10r。

in_file是指向要播放的磁盘上的mpeg2文件的指针。我想用内存中的 data10r unsigned char 数组替换这个文件...... 缓冲区包含要发送到解码器的 4096 字节视频

我花了好几个小时想办法修改这个功能,暂时没有成功。

预先感谢您的帮助,

皮埃尔

在使用 glibc 的 linux 上,您可以使用 fmemopen 获取 FILE*,然后使用普通的 fread 从中读取。因此,您只需要在函数的开头添加 FILE *in_file = fmemopen(data10r, *size10r, "r");,在函数的末尾添加 fclose(in_file);

如果您也需要支持其他系统,您可以使用 memcpy 并手动计算偏移量来实现相同的功能。

如果整个数据已经在内存中,你还需要按 4kb 块解码吗?为什么不对整个文件进行 运行 解码?从你的代码来看,它只是 decode_mpeg2(data10r, data10r + *size10r);(即函数的全部代码)。