У меня есть приложение с собственным кодом, которое использует образец Camera2Video от Google, опубликованный на GitHub. К сожалению, существует проблема с Android 6 и выше, которая приводит к повреждению записанного видео. Согласно отчету о проблеме на GitHub, время декодирования первого кадра является огромным по сравнению с рабочим видео.
Для моего примера файла длиной 11 с, симптомы:
- На самом телефоне Android видео проигрыватель зависает на первом кадре. Звук воспроизводится, воспроизведение останавливается через 11 секунд. После возврата ползунка в начало видео и аудио воспроизводятся синхронно.
- В Windows, использующей разные проигрыватели (Groove, WMP, VLC), либо видео отсутствует, либо оно останавливается в первом кадре. Аудио всегда хорошо. Длина видео показана как 11 с. Некоторые проигрыватели останавливаются в конце, некоторые продолжают увеличивать время воспроизведения после того, как ползунок воспроизведения на 100%.
- В Google Chrome в Windows продолжительность видео отображается как 3,5 часа. Звук воспроизводится в течение первых 11 секунд. Видео показывает первый кадр почти все время, а затем 11 секунд после окончания воспроизведения видео.
Поведение Google Chrome лучше всего показывает, что происходит: в файле 11 с аудио и 11 с * 30 к / с = 330 кадров. Но первый кадр не 1/30 с, а около 3,5 часов.
Сначала я пытался использовать различные инструменты для восстановления видео, чтобы исправить файл mp4, но большинство из них ничего не меняли или не находили никаких проблем, которые могли бы исправить, и не работали в первую очередь.
После небольшой пробной ошибки я нашел первое рабочее решение. Я использовал ffmpeg с параметром фильтра setpts
:. .\ffmpeg.exe -i "broken.mp4" -vf setpts=N/FRAME_RATE/TB "fixed.mp4"
. После этого исправленный файл работает нормально (и намного меньше).
Проблема этого подхода заключается в том, что для его завершения требуется столько же времени, сколько и длина видео, которое я хочу исправить. Но видео, которое я хочу сделать с приложением, может занять около часа в будущем.
Поэтому мне интересно, есть ли возможность отрегулировать продолжительность, для которой показан первый кадр? Теоретически это должно означать, что ffmpeg просто нужно заменить одно целое число и вообще не иметь дело с де- или кодированием. Можно ли это сделать и как?