У меня есть .mp4видеофайл, полученный с несжатого видео, .aviснятого с веб-камеры emgu. Emgu videoWriterустановлен 30fpsдаже на реальное видео fps, возможно, ниже, например 29fps. Команда, которая используется для сжатия .avi:
В дополнение к этой видеозаписи у меня есть .wavфайл, который пришел с другого устройства. Я пытаюсь синхронизировать их с содержимым с помощью следующей команды:
Я хотел бы отметить, что и аудио, и видео имеют общее начало. В то время как аудиовизуальный контент имеет хорошую синхронизацию в начале, синхронизация теряется в конце записи. Не могли бы вы сделать предложение о том, что происходит?
Ваша помощь высоко ценится, спасибо.
@slhck да, я сделал рефакторинг и предоставил более подробную информацию о текущей ситуации. Таким образом, я подумал, что было бы лучше начать это с попрошайничества, предлагая другую точку зрения, и это поможет другим понять больше. Я надеюсь, что это не большая проблема.
Darkmoor 7 лет назад
0
@slhck Я думаю, у меня есть причина моей проблемы. Сжатое видео не имеет постоянного `fps` на протяжении всей записи. Могу ли я спросить, возможно ли преобразовать видео с непостоянным fps в постоянное с помощью `ffmpeg`?
Darkmoor 7 лет назад
0
Использование параметра `-r` в команде сжатия с` fps` ниже, чем у фактического, обеспечит ли видео с постоянной частотой кадров `.mp4` видео?
Darkmoor 7 лет назад
0
Я не уверен, недавно не сталкивался с видео с переменной частотой кадров. У вас есть образец? Вы пробовали опцию `force-crf`?
slhck 7 лет назад
0
@slhck извините за задержку. Я проверил, чтобы сжать видео с опцией `force-crf`, но не сработало. Могу ли я спросить, есть ли возможная опция для аудио `.wav`, которая не всегда имеет постоянную частоту дискретизации?
Darkmoor 7 лет назад
0
@slhck спасибо за ответ. Я хотел бы сделать последнюю попытку, поэтому, пожалуйста, позвольте мне спросить следующее. Как описано в вопросе, реальное `fps` потока отличается от сохраненного через` opencv`. Можно ли изменить `fps` во время сжатия или после? Также возможно ли это для файла `.wav`? Еще раз спасибо!
Darkmoor 7 лет назад
0
Я написал более подробный ответ ниже. Опять же, просмотр некоторых примеров поможет в устранении неполадок, но, как я понимаю вашу проблему сейчас, кажется, что это невозможно исправить.
slhck 7 лет назад
0
1 ответ на вопрос
1
slhck
Я думаю, проблема в том, что у вашего входного видео уже есть неправильные метки времени из-за того, как оно было закодировано. Я понимаю, что исходное видео с веб-камеры выводило кадры переменной длины (т. Е. Видео с переменной частотой кадров), но несжатый файл AVI может хранить только кадры постоянной длины.
Таким образом, читая этот файл AVI (или любой впоследствии сжатый файл MP4), ffmpeg будет предполагать, что это видео с постоянной частотой кадров. Это приводит к «нарастанию» асинхронности с течением времени, поскольку временные метки в AVI / MP4 имеют постоянные смещения. ffmpeg не может исправить это за вас, потому что введенные временные метки уже неверны. Другими словами, я предполагаю, что videoWriterвы ссылаетесь на создание видео с постоянной частотой кадров с переменной частотой кадров, что создает неправильные временные метки. Не зная, когда или как изменилась частота кадров, вы не сможете исправить временные метки.
Единственным вариантом будет повторное создание видеопотока с веб-камеры с контейнером, который поддерживает переменную частоту кадров (например, MKV или MP4 / MOV). Затем любое последующее преобразование может синхронизировать контент с аудиопотоком. Но так как этот веб-канал, вероятно, в прямом эфире, вернуться назад невозможно. Кроме того, я не думаю, что для OpenCV videoWriterвозможно также выводить переменную частоту кадров (но я не эксперт в этом).
Примечание. Эту проблему было бы легче устранить, если исходное видео было закодировано с неправильной постоянной частотой кадров. Затем можно заставить ffmpeg принять другую частоту кадров для входного видео, эффективно удаляя исходные временные метки и генерируя новые, предполагая постоянную частоту кадров. Например, если преобразование вашего видео привело к созданию видео со скоростью 30 кадров в секунду, но исходный вход составлял 29 кадров в секунду, сделайте следующее: