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

时间:2015-01-16 17:23:05

标签: c memory mpeg

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

我想使用内存中的数据(存储在内存中的unsigned char数组)。以下是我想修改的功能的详细信息:

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是一个unsigned char数组,在内存中包含大小为10r的mpeg2数据。

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

我花了几个小时才找到改变这个功能的解决方案,暂时没有任何成功。

先谢谢你的帮助,

皮尔

1 个答案:

答案 0 :(得分:0)

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

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

如果整个数据已经在内存中,你甚至需要用4kb块解码吗?为什么不在整个文件上运行解码?通过你的代码判断Judjing,它只是decode_mpeg2(data10r, data10r + *size10r);(这是整个函数代码)。