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

2019-10-28 20:49发布

我需要对数据进行解码,从交错流(如AVI)。

因此,它是指我有建立在这样的形状(序列)的容器

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

为了这一刻我有一个基本的实现MediaCodec解码器。 我有MediaExtractor ,我打电话setDataSource()它让MP4文件URI作为PARAM。 然后,为了得到一个解码的结果,我需要排队/离队缓冲区。

因此,这意味着字节生产者MediaExtractor它知道如何从URI中提取字节。

但在我的目的,我有一个文件(容器),即由几个类型的数据的顺序...

我想要做的-我会读只是一个MP4块(一个视频帧),然后我需要通过这个块(帧) MediaCodec与解码处理。 我想成为一个供应商自己。

所以,问题是如何传递字节的缓冲区,以MediaCodec为了与解码处理?

PS还有,如果我们的交织容器将各有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()这个方法知道如何与文件描述符工作。 他得到这样PARAMS的提取,描述,偏移量和数据的大小。

所以在我的情况,我说我有这样的数据序列

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(例如,的fileno( FP),5000,数据尺寸)

它意味着,如果你有exapmle 3000 MP4配件每次你需要创建新的MediaExtractorsetDataSourceFd() ...

我不知道这是否是让它正确的方式...

文章来源: How to decode video from given buffer? (MediaCodec)