Получение ошибки unstreamable с AndroidBreakout

Я изучал документацию и примеры на http://bigflake.com/mediacodec/ от Fadden, и применил патч http://bigflake.com/mediacodec/0001-Record-game-into-.mp4.patch к новой игре. К сожалению, после компиляции кода я понял, что он не работает, создавая видеофайлы, которые невозможно передать в потоковом режиме.

Я вижу следующую ошибку: «Файл mp4 не будет доступен для потоковой передачи».

По словам Фаддена, это должно быть исправлено путем проверки mBufferInfo.flags(https://stackoverflow.com/questions/23934087/non-streamable-video-file-created-with-mediamuxer), что уже сделано в его код, так что я в полной растерянности. У кого-нибудь еще работал патч для записи видео?


person matt snider    schedule 07.11.2014    source источник
comment
Сообщение исходит из строки 913 файла MPEG4Writer.cpp (android.googlesource.com/platform/frameworks/av/+/). Он испускается, если mWriteMoovBoxToMemory не установлен. В строке 642 есть длинный комментарий, объясняющий, что это такое. Короткая версия заключается в том, что есть фрагмент данных, который может быть записан в начале файла или в конец, и если он не записан в начале, то файл не может быть потоковым, потому что получатель потока не может перейти к конец, чтобы прочитать это. На самом деле я не знаю, что заставляет его не писать на фронт.   -  person fadden    schedule 07.11.2014
comment
Пожалуй, следует добавить: в Grafika есть более полные примеры (github.com/google/grafika), например записать приложение GL.   -  person fadden    schedule 07.11.2014


Ответы (2)


Предупреждение, которое вы видите, — это просто предупреждение, не более того. Файлы MP4 в любом случае в большинстве случаев не транслируются, в том смысле, что вы сможете передать записанный MP4 по каналу и воспроизвести его на другом конце (если только вы не прибегнете к большому количеству дополнительных уловок или не используете фрагментированный MP4). который мультиплексор Android MP4 не записывает нормально). Потоковая передача здесь означает, что как только у вас будет окончательный файл MP4, вы можете начать его воспроизведение без необходимости искать конец файла (что может делать воспроизведение через HTTP, например, с запросами диапазона байтов HTTP).

Чтобы записать потоковый MP4, мультиплексор пытается угадать, насколько большим будет ваш файл, и резервирует соответственно большую область в начале файла для записи индекса файла. Если файл получается больше и индекс не помещается в зарезервированную область, его нужно записать в конец файла. См. строки 506–519 в https://android.googlesource.com/platform/frameworks/av/+/lollipop-release/media/libstagefright/MPEG4Writer.cpp для получения дополнительной информации об этом предположении. В основном предположение сводится к следующему: «Значение MAX _MOOV_BOX_SIZE по умолчанию основано на записи видео продолжительностью около 3 минут с битрейтом около 3 Мбит/с, поскольку статистика также показывает, что большая часть снятого видео будет длиться менее 3 минут. "

Если вы хотите превратить такой файл MP4 без потоковой передачи в потоковый, вы можете использовать инструмент qt-faststart из libav/ffmpeg, который просто переупорядочивает блоки в файле.

person mstorsjo    schedule 07.11.2014
comment
Ах. Спасибо... Странно. Первые несколько видео, которые я создал, не воспроизводились, но сегодня это работает. - person matt snider; 08.11.2014