我需要对交错流(例如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的零件,则需要创建新的MediaExtractor
和setDataSourceFd()
...
我不确定这是否是正确的方法...