如何从给定的缓冲区解码视频? (MediaCodec)

时间:2019-09-16 12:28:33

标签: mediacodec android-mediacodec

我需要对交错流(例如AVI)中的数据进行解码。

所以,这意味着我有一个以这种形状(序列)构建的容器

mp4 --> other data --> mp4 --> other data --> so on...

此刻,我有了MediaCodec解码器的基本实现。我有MediaExtractor,在这里我叫setDataSource(),它将mp4文件uri作为参数。然后为了获得解码结果,我需要队列/出队缓冲区。

因此,这意味着字节生成器为MediaExtractor,它知道如何从uri中提取字节。

但是我的目的是要有一个文件(容器),它依次包含几种类型的数据...

我想做的-我将只读取一个mp4块(一个视频帧),然后需要将此块(帧)传递给MediaCodec进行解码处理。我想自己成为供应商。

所以,问题是如何将字节缓冲区传递给MediaCodec以便进行解码处理?

P.S。仍然没有决定我们的交错容器是否将每个mp4块作为单独的mp4文件(包括标头),还是顺序中的第一帧...

或者也许由于这个原因我需要使用ffmpeg lib?

我希望我不要错过任何注意事项

编辑

与此同时,我找到了这样的解决方案(不是最终解决方案)

AMediaExtractor *ex = AMediaExtractor_new();

FILE *fp = fopen(filename.c_str(), "rb");
fseek(fp, 0, SEEK_END);
long size = ftell(fp);
fseek(fp, 0, SEEK_SET);
auto err = AMediaExtractor_setDataSourceFd(ex, fileno(fp), 0, size);

setDataSourceFd()此方法知道如何使用文件描述符。他得到诸如提取器,描述符,偏移量和数据大小之类的参数。

因此,就我所知,我有这样的数据序列

mp4 --> other data --> mp4 --> other data --> so on...

让我们的第一个mp4数据从乞讨开始,所以这意味着没有偏移,因此setDataSourceFd(ex, fileno(fp), 0, dataSize), let's say second mp4 data starts after 5000 bytes... so setDataSourceFd(ex,fileno(fp),5000,dataSize)

这意味着,如果每次都有3000 mp4的零件,则需要创建新的MediaExtractorsetDataSourceFd() ...

我不确定这是否是正确的方法...

0 个答案:

没有答案