Android MediaCodec на qcom не имеет вывода на поверхность, используя в качестве плагина Unity? - PullRequest
0 голосов
/ 09 января 2019

Я работаю над проектом Unity, который использует плагин Android, где MediaCodec декодирует данные I-кадра HEVC / H265. Сжатые данные считываются из файла, который представляет собой необработанные данные HEVC / H265. Вот что я сделал на проекте:

  1. Сторона Unity создает текстуру как цель рендеринга и преобразует ее в поверхность Android.
  2. Передайте поверхность на сторону Android в качестве выхода MediaCodec.
  3. в синхронном режиме считывает необработанные данные HEVC / H265 из локального файла и отправляет их в буфер, который получает из codec.getInputBuffer(index).
  4. получить выходной буфер MediaCodec и выпустить его на поверхность.

Но на разных платформах результат будет другим:

  • Когда я пробую его в мобильном телефоне HUAWEI (чей MediaCodec основан на hisi), он работает нормально и может воспроизводить видео.
  • когда я пробую его в мобильном телефоне на базе qcom, на поверхности ничего не отображается.

Я попытался запустить MediaCodec с мультисжатыми видеоданными, но он все равно не работает.

  1. Сторона 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);
  1. Передайте поверхность на сторону Android в качестве вывода MediaCodec.
codec.configure(format, surface, null, 0);
  1. в синхронном режиме, считывать необработанные данные 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);
}
  1. получить выходной буфер 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 нет обработанного вывода?

...