FFmpeg конвертувати відео w / пропущені кадри, не синхронізовані


3

Я записав відео, використовуючи Bandicam з кодером MJPEG, щоб отримати найменшу кількість відставання. Тепер я намагаюся перетворити цей масивний файл на h264 avi, використовуючи ffmpeg. Я знаю, що у відеопотоці є пропущені фрейми ... більше 100 у перші дві хвилини, що я припускаю, тому що Bandicam впав, коли він не зміг встигнути. Отже, коли я перетворюю файл на h264, відео та аудіосинхронізація не синхронізовані, і, здається, все частіше не синхронізується, як виходить відео. Ось моя основна команда в ffmpeg:

ffmpeg -i "C:\...\input.avi" -vcodec libx264 -q 5 -acodec libmp3lame -ar 44100 -ac 2 -b:a 128k "C:\...\output.avi"

Я спробував ВСЕ, що я можу уявити, включаючи:

-itsoffset [-]00:00:01

Пробували це до і після вхідного файлу. Це не спрацьовує, тому що, коли відео прогресує, воно стає дедалі сильнішим.

-async 1

Не працює.

-vsync 1

Не працює, але в ньому відображаються пропущені кадри.

Два входи одного файлу з використанням відображення -map 0:0 -map 1:1. Не працює.

Джерело відтворюється дуже добре. Будь-які ідеї, як конвертувати його з ffmpeg і зберегти аудіо та відео синхронізовані? Дякую.


Причина того, що синхронізація погіршується по мірі просування файлу, полягає в тому, що існує різниця між довжиною відео та довжиною звуку. Якщо вони були однакової довжини, то зміщення виправили це. Чи має вихідний файл однаковий випадок? Можливо, вам доведеться демультувати оригінал вручну, і конвертувати звук окремо від відео, а потім remux в AVI.
Bon Gart

Добре, я думаю, що я можу це зробити. Не виключено, що звук «скинув кадр» (я знаю, що у нього немає фреймів, але ви отримали ідею)?
preahkumpii

Це дійсно залежить від того, чи є PTS (часові мітки презентації) правильними, тому що тільки тоді синхронізація буде працювати. Я припускаю, що це важко для кодера / мультиплікатора навіть усвідомити, що випав кадр і де поставити аудіо між ними, так що я б пішов з тим, що @ BonGart сказав і побачити, де ви можете піти звідти. // Аудіо має фрейми теж ("зразки"), але я думаю, що навряд чи з'являться пропущені зразки.
slhck

Можливо, ви також можете опублікувати повний, нерозрізний вивід консолі з команди FFmpeg.
slhck

Просто демультифікація оригіналу і дивлячись на довжини в будь-якому інформаційному інструменті повинні дати вам голови .... забезпечення аудіо не виключено в оригіналі.
Bon Gart

Відповіді:


5

Можливо, це були пропущені кадри, якщо вони були дублікатами, якщо джерело відтворюється відмінно, то ваша проблема скоріше пов'язана з тим, що контейнери AVI не дуже добре обробляють формати кодування VBR (зокрема, h264 не грає добре з AVI). Я б порекомендував, починаючи з демпінгу відео на нестиснутий AVI для тестування, оскільки це найбільш узгоджений формат для кодування від

ffmpeg -i input.avi -acodec copy -vcodec rawvideo output.avi

Тоді, припускаючи, що грає в синхронізації, ви повинні спробувати зробити копію прямого кодека і remux джерела в інший формат, тобто:

ffmpeg -i input.avi -acodec copy -vcodec copy output.mkv

MKV, як правило, обробляє майже все, що ви в ній без проблем. Я навіть приховати деякі зашифровані zip файли в різних відео MKV на моєму комп'ютері, оскільки ви можете кодувати файлові вкладення в MKV. Отже, якщо будь-яка з них працює без проблем із синхронізацією, спробуйте те ж саме, але перекодуйте відео або аудіо, але тільки один або інший, щоб почати і зберегти формат контейнера, щоб ви знали, де лежить проблема. тобто.

ffmpeg -i input.avi -acodec copy -vcodec libx264 output.mkv

або

ffmpeg -i input.avi -acodec libmp3lame -vcodec copy output.mkv

Спробуйте зробити кожну тестову конверсію якомога простішою, тобто не змінюйте швидкість бітрейту / частоту дискретизації, використовуйте приклади параметрів, які я перерахував спочатку. Після кожного з них ви будете на крок ближче до знання того, що ви можете і не можете зробити. Якщо ви повинні мати h.264 я рекомендую йти з mp4 контейнер, як це набагато більш сумісним, ніж AVI, з іншого боку, якщо вимога AVI контейнер, то я рекомендую wmv3 або msvideo1 для відео, як вони будуть найбільш ймовірно, щоб кодувати правильно.


Маючи більше проблем, що ваш метод, здається, трохи допомагає. Я ще не перетворив його на rawvideo, b / c займає так довго, але я спробував перетворити в mkv і mp4 контейнери. MKV розбився з цим [matroska @ [...] can't write packet with unknown time stamp. av_interleaved_write_frame{}: invalid argument. MP4 сказав [mp4 @ ...] pts has no value. Моя оригінальна команда була ffmpeg -i vid.avi -i aud.mp3 -vcodec copy -acodec copy -map 0:0 -map 1:0 output.mkv[mp4]. Я спочатку витягнув відео та аудіо окремо і зробив -vsync 1 з відео, коли я зробив це, щоб переконатися, що я отримав постійну частоту кадрів в 24 кадрів в секунду.
preahkumpii

здається, що просто зміна контейнера на mp4 зробила коректне перетворення з вихідного файлу. Я поняття не мав, що контейнер є таким важливим.
preahkumpii

Це дійсно залежить від ситуації, я вважаю, що найкращим способом уникнути невдачі є те, що потрібно поступово спробувати незначні коригування мого методу, поки не знайду точку, в якій вона працює, щоб я краще зрозуміла, що відбувається.
Justin Buser

0

Майже завжди, коли аудіо та відео не синхронізовані, а різниця між ними поступово погіршується протягом фільму, особливо після перетворення, проблема полягає в тому, що аудіо та відео компоненти мають різну довжину. Як було зауважено в цьому випадку, це сталося тому, що відеокадри скидалися, але звук був відносно недоторканим під час перетворення.

У такі часи краще спочатку перевірити джерело фільму, щоб переконатися, що звук дійсно синхронізований. Якщо це так, то демультуйте фільм, і обробляйте відео та аудіо компоненти окремо.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.