У меня есть приложение с собственным кодом, которое использует образец 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 просто нужно заменить одно целое число и вообще не иметь дело с де- или кодированием. Можно ли это сделать и как?

1 ответ1

0

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

Извлечь сырой поток:

ffmpeg.exe -i "broken.mp4" -c copy broken.h264

Remux:

ffmpeg.exe -i broken.h264 -i broken.mp4 -map 0 -map 1:a -c copy new.mp4

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .