我需要对数据进行解码,从交错流(如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配件每次你需要创建新的MediaExtractor
和setDataSourceFd()
...
我不知道这是否是让它正确的方式...