如何从给定缓冲区解码视频? (媒体编解码器)

2024-04-11

我需要解码来自交错流(如 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... sosetDataSourceFd(例如,文件号(fp),5000,数据大小)

这意味着如果您有例如 3000 个 mp4 零件,每次您都需要创建新零件MediaExtractor and setDataSourceFd()...

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


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从给定缓冲区解码视频? (媒体编解码器) 的相关文章

随机推荐