Разделение, перекодирование и объединение видеофайлов приводит к щелчку аудио

382
Faraz Ahmed

Мы хотим быстрее кодировать большие видеофайлы. Чтобы ускорить кодирование, мы используем несколько серверов кодирования. Ниже приведен наш процесс кодирования потока

  1. Сначала мы разбиваем видео на маленькие сегменты, используя команду ниже

    ffmpeg -i F:\video_data_set\4k_compressed.mp4 -f segment -segment_time 5 -segment_start_number 1 -codec copy -copyts -avoid_negative_ts 1 F:\video_data_set\test\%d_4k_compressed.mp4

  2. Затем мы разделяем эти сегменты между несколькими серверами кодирования. Каждый сервер кодирования перекодирует сегмент, используя следующую команду

    ffmpeg -hide_banner -i F:\video_data_set\test\1_4k_compressed.mp4 -c:a aac -ar 44100 -b:a 128k -c:v libx264 -x264opts nal-hrd=cbr:force-cfr=1 -pix_fmt yuv420p -profile:v baseline -level 3.0 -vf "scale=1280:-2,setdar=16:9" -b:v 3.9M -minrate 3.9M -maxrate 3.9M -bufsize 7.8M -preset ultrafast -crf 18 -r 30 -g 30 -threads 8 F:\video_data_set\test\1_4k_compressed_1.mp4

  3. Когда все сегменты перекодированы, мы присоединяем их к одному файлу, используя команду ниже

    ffmpeg -hide_banner -f concat -safe 0 -i F:\video_data_set\test\files_2.txt -c copy -threads 8 F:\video_data_set\4k_compressed_1.mp4

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

Например, я закодировал 5 сегментов длительностью 6, 6, 6, 6 и 6 секунд, когда я присоединился к ним, используя вышеупомянутую команду, у выходного видео есть звук щелчка при 6,12,15 и 21 секунде видео.

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

1

1 ответ на вопрос

1
Eugen Rieck

Это хорошо известный эффект: -segmentвидео разбивается на допустимую точку входа видео (т.е. I-кадр), но не всегда на действительную точку входа аудио.

Лучший способ обойти это - разделить видео и аудио на первом шаге:

ffmpeg -i F:\video_data_set\4k_compressed.mp4 -f segment -segment_time 5 -segment_start_number 1 -c:v copy -an -copyts -avoid_negative_ts 1 F:\video_data_set\test\%d_4k_compressed.mp4 -vn -c:a aac -ar 44100 -b:a 128k F:\video_data_set\test\audio.m4a 

затем перейдите к фрагментам видео, как в текущем рабочем процессе.

Для последнего шага используйте

ffmpeg -hide_banner -f concat -safe 0 -i F:\video_data_set\test\files_2.txt -i F:\video_data_set\test\audio.m4a -map 0:v -map 1:a -c copy -threads 8 F:\video_data_set\4k_compressed_1.mp4 

Чтобы заново добавить аудио.

Здравствуйте, Евгений, я протестировал это решение, но таким образом звук не синхронизирован. Я думаю, что некоторые кадры пропали таким образом из-за того, что звук не синхронизирован, пожалуйста, помогите мне решить эту проблему. Faraz Ahmed 6 лет назад 0
Вы пробовали фильтры SETPTS и ASETPTS для синхронизации аудио? Eugen Rieck 6 лет назад 0
Нет, я не пробовал эти фильтры, как я могу использовать эти фильтры Faraz Ahmed 6 лет назад 0
Прочитайте в документации - важно установить PTS для видео и аудио на одно и то же значение при разделении, так как они могут иметь смещение, которое не отображается при чередовании. Eugen Rieck 6 лет назад 0
Здравствуйте, Евгений, не могли бы вы дать мне знать, какое значение разбиения нам нужно установить для аудио и видео очков. Я прочитал документацию. У аудио-видео очков есть постоянные значения. Faraz Ahmed 6 лет назад 0
Я бы начал с `setpts = PTS-STARTPTS` и` asetpts = N / SR / TB`, но `setpts = N / (25 * TB)` (для 25fps) также может быть идеей. Eugen Rieck 6 лет назад 0