Я работаю над проектом Unity, который использует плагин Android, где MediaCodec декодирует данные I-кадра HEVC / H265. Сжатые данные считываются из файла, который представляет собой необработанные данные HEVC / H265. Вот что я сделал на проекте:
- Сторона Unity создает текстуру как цель рендеринга и преобразует ее в поверхность Android.
- Передайте поверхность на сторону Android в качестве выхода MediaCodec.
- в синхронном режиме считывает необработанные данные HEVC / H265 из локального файла и отправляет их в буфер, который получает из
codec.getInputBuffer(index)
.
- получить выходной буфер MediaCodec и выпустить его на поверхность.
Но на разных платформах результат будет другим:
- Когда я пробую его в мобильном телефоне HUAWEI (чей MediaCodec основан на hisi), он работает нормально и может воспроизводить видео.
- когда я пробую его в мобильном телефоне на базе qcom, на поверхности ничего не отображается.
Я попытался запустить MediaCodec с мультисжатыми видеоданными, но он все равно не работает.
- Сторона Unity создает текстуру как цель рендеринга и преобразует ее в поверхность Android.
texture = new Texture2D(width, height, TextureFormat.RGB24, false, true);
SphereMaterial.SetTexture("_MainTex", texture);
SphereTextureNativePtr = SphereMaterial.GetTexture("_MainTex").GetNativeTexturePtr();
androidSurface = OVR_Media_Surface(SphereTextureNativePtr, width, height);
- Передайте поверхность на сторону Android в качестве вывода MediaCodec.
codec.configure(format, surface, null, 0);
- в синхронном режиме, считывать необработанные данные HEVC / H265 из локального файла:
int inIndex = codec.dequeueInputBuffer(10000);
if (inIndex >= 0) {
ByteBuffer buffer = codec.getInputBuffer(inIndex);
int sampleSize = ReadH265(urls[CurrentExtractorIdx],buffer);
codec.queueInputBuffer(inIndex, 0, sampleSize, sampleTime, 0);
}
- получить выходной буфер MediaCodec и выпустить его на поверхность.
int outIndex = codec.dequeueOutputBuffer(info, 10000);
switch (outIndex) {
case MediaCodec.INFO_OUTPUT_FORMAT_CHANGED:
Log.i(TAG, "run: new format: " + codec.getOutputFormat());
break;
case MediaCodec.INFO_TRY_AGAIN_LATER:
Log.i(TAG, "run: try later");
break;
case MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED:
Log.i(TAG, "run: output buffer changed");
break;
default:
codec.releaseOutputBuffer(outIndex, true);
break;
}
Почему у мобильного телефона qcom-based
нет обработанного вывода?