Как корректно разрезать и соединить видео ffmpeg?

У меня есть видео, длительностью 10 секунд (original_video.mp4).

Разделяю видео на 2 видеофайла

ffmpeg -ss 00:00:00 -to 00:00:05 -i original_video.mp4 -c copy cut_0.mp4
ffmpeg -ss 00:00:06 -to 00:00:10 -i original_video.mp4 -c copy cut_1.mp4

Объединяю видео

ffmpeg -f concat -i join_video_filelist.txt -c copy join_video.mp4

join_video_filelist.txt

file 'cut_0.mp4'
file 'cut_1.mp4'

В результате, в объединенном видео, "на стыке" 4 - 5 секунды пропадает звук. Пропадает на секунду и потом снова появляется. Почему это происходит и как это исправить? Как корректно разрезать и соединить видео ffmpeg?


Ответы (1 шт):

Автор решения: eri

Без перекодирования видео ffmpeg режет видео по размеру блока, по ключевому кадру. А у звука размер блока меньше и режется он по отметке времени.

Попробуй найти ключевой кадр рядом с нужным отрезком тамким кодом:

ffprobe -select_streams v -show_frames -show_entries frame=pkt_pts_time,pict_type -v quiet in.mp4 | 
awk -F= ' 
  /pict_type=/ { if (index($2, "I")) { i=1; } else { i=0; } } 
  /pkt_pts_time/ { if (i && ($2 >= $INTERVAL)) print $2; }  
' | head -n 1

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

Если резать нужно точно, то только перекодирование.

→ Ссылка