Как избежать растущей задержки с помощью ffmpeg между звуком и необработанными видеоданными?
Привет всем и спасибо за чтение!
Вот моя проблема: у меня есть программа, передающая необработанные видеокадры на стандартный вывод. Эта программа использует OpenCV для захвата и обработки видео и вывода непосредственно обработанных кадров. Цикл синхронизируется с выбранной частотой кадров. Я использую ffmpeg для чтения со стандартного ввода, и все отлично работает для видео. Но теперь, когда я добавил звук, у меня возникла большая проблема: происходит растущая задержка, и мне действительно нужно от нее избавиться. Итак, вот моя идея, но мне действительно нужна ваша помощь:
Я должен найти способ включить информацию о метках времени в необработанное видео. Чтобы быть понятным для ffmpeg, он должен быть известным контейнером, совместимым с необработанным видео. И тогда мне нужно будет использовать API контейнера и передать его на стандартный вывод в моей программе. Я действительно не знаю, что использовать в джунглях видео форматов и кодеков, и я не знаю, как включить синхронизацию меток времени в ffmpeg...
Если у кого-то есть идея, мне действительно интересно здесь. Для информации вот командная строка, которую я использую для передачи необработанного видео:
./myprogram | ffmpeg -y -f alsa -i pulse -ac 2 -f rawvideo -vcodec rawvideo -r 24 -s 640x480 -pix_fmt bgr24 -i - -vcodec libx264 -pix_fmt yuv420p -r 24 -f flv -ar 44100 out.flv;
Спасибо тебе большое,
Roland
2 ответа
Задержка между видео и аудио - старая проблема в мультимедийном пространстве. Не существует серебряной пули для ее решения, но вы можете попробовать использовать другие кодеки (особенно новые, а не от Microsoft). Вы можете найти более низкие задержки, и, для приличной длины видео (1 час), ничего страшного.
Самый простой выход - это обрабатывать аудио и видео файлы в сегментах, скажем, сокращать 30 минут видео и аудио. Поскольку потоки десинхронизированы, вы можете управлять им с помощью ffmpeg, см. Руководство здесь или здесь, приятно то, что вам не нужны два файла (потоки), так как ffmpeg может работать с исходным кодом из того же файла.
Как только вы выяснили задержку, повторите для следующего сегмента и так далее.
Иногда звук может длиться более 30 минут, например, 33 минуты. Затем я бы использовал Audacity, чтобы сжать длину до 30 минут, прежде чем объединить.