我需要解码来自交错流(如 AVI)的数据。
所以,这意味着我有一个以这种形状(序列)构建的容器
mp4 --> other data --> mp4 --> other data --> so on...
目前我有一个基本的实现MediaCodec
解码器。我有MediaExtractor
我打电话的地方setDataSource()
它获取 mp4 文件 uri 作为参数。然后为了获得解码结果,我需要队列/出队缓冲区。
所以,这意味着字节生产者是MediaExtractor
它知道如何从 uri 中提取字节。
但在我的目的中,我有一个文件(容器),其中按顺序包含几种类型的数据......
我想做的 - 我将只读取一个 mp4 块(一个视频帧),然后我需要将此块(帧)传递给MediaCodec
进行解码处理。我自己也想成为供应商。
所以,问题是如何将字节缓冲区传递给MediaCodec
为了进行解码处理?
附:仍然没有决定我们的交错容器是否将每个 mp4 块作为单独的 mp4 文件(包括标题),或者只是序列中的第一帧......
或者也许因为这个原因我需要使用 ffmpeg lib?
我希望我没有错过任何通知,请随时询问
EDIT
同时我找到了这样的解决方案(不是最终的)
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(例如,文件号(fp),5000,数据大小)
这意味着如果您有例如 3000 个 mp4 零件,每次您都需要创建新零件MediaExtractor
and setDataSourceFd()
...
我不确定这是否是正确的制作方法......