Mediamuxer создает поврежденное видео, когда образцы записываются в пакетном режиме

Я пытаюсь использовать Android MediaMuxer и MediaCodec для создания видео MP4.

Если я сливаю кадры из кодека напрямую в мультиплексор, вызывая writeSampleData(), все работает нормально, и получается правильное видео.

Но если я попытаюсь сначала сохранить эти кадры в массиве, а потом решу отправить их на мультиплексор, я не смогу создать работающее видео, даже если метки времени представления верны.

По какой-то причине кажется, что вывод mediamuxer зависит не только от временных меток представления, но также и от фактического времени, когда вызывается writeSampleData, хотя я понимаю, что правильных временных меток должно быть достаточно.

Кто-нибудь может пролить свет на этот вопрос?

2 ответа

Решение

Спасибо mstorsjo и fadden. У меня действительно была комбинация ошибок, которые не позволяли мне понять, что на самом деле происходит. Оба ваших вопроса привели меня к правильному коду и убеждению, что использование writeSampleData() не чувствительно ко времени.

Да, я получал неправильные буферы в первый раз. Изначально проблема не была заметна, потому что мультиплексор записывал кадры до того, как буферы были переписаны. Когда я представил задержки и решил продублировать содержимое буферов, я столкнулся с другой проблемой (в основном с состоянием гонки) и пришел к выводу, что это не так.

Этот код (для проекта SmartPolicing) выполняет захват видео и аудио для создания файла MP4. Я мог бы использовать MediaRecorder (это было первоначальное решение), но мы также хотели перехватить кадры и потоковое видео через Интернет, поэтому мы удалили MediaRecorder и создали собственное решение.

Теперь все идет гладко. Большое спасибо, ребята.

Вы уверены, что на самом деле храните полные данные для записываемых кадров, а не только индексы буфера?

Другие вопросы по тегам