Быстро обрезать длинный видео фрагмент - PullRequest
0 голосов
/ 30 января 2020

Допустим, у меня есть видео под названием Concert.mp4. Я хочу быстро извлечь из него производительность с минимальным перекодированием. Я хочу сделать эквивалент этого, но быстрее:

ffmpeg -i "Concert.mp4" -ss 00:11:45 -to 00:18:15  -preset veryfast -y artist.mp4

Это занимает 17 секунд, что слишком много для наших нужд.

Теперь получается, что 11:45 и 18:15 не попадают в iframes, поэтому, если вы попробуете это, вы получите 3-секундную задержку в начале, прежде чем видео покажет:

ffmpeg -i "Concert.mp4" -ss 00:11:45 -to 00:18:15 -c copy -y artist.mp4

Запустив эту команду, мы увидим, где нам нужно сократить:

ffprobe -read_intervals "11:00%19:00" -v error -skip_frame nokey -show_entries frame=pkt_pts_time -select_streams v -of csv=p=0 "Concert.mp4" > frames.txt

Итак, нам нужно закодировать первые 3,708 секунды, скопировать середину, а затем закодировать последние 5,912 секунды.

Я могу получить 3 сегмента для все выглядят идеально (сами по себе), как это:

ffmpeg -ss 698.698 -i "Concert.mp4" -ss 6.302 -t 3.708 -c:v libx264 -c:a copy -c:s copy -y clipbegin.mp4

ffmpeg -ss 708.708 -to 1089.088 -i "Concert.mp4" -c copy -y clipmiddle.mp4

ffmpeg -ss 1089.088 -i "Concert.mp4" -t 5.912 -c:v libx264 -c:a copy -c:s copy -y clipend.mp4

ffmpeg -f concat -i segments.txt -c copy -y artist.mp4

сегментов. Текст, конечно, содержит следующее:

file 'clipbegin.mkv'
file 'clipmiddle.mkv'
file 'clipend.mkv'

Я видел это решение, представленное здесь, но никакая настройка не получает это у меня работает:

https://superuser.com/a/1039134/73272

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

Объединенное видео продолжает глючить через 3 секунды, возможно, из-за того, что время PTS другое или что-то в этом духе (используя некоторые параметры, я видел предупреждающие сообщения этот эффект). Что-нибудь, что я могу добавить к командам выше, чтобы заставить это работать? Единственное требование состоит в том, что средняя команда не должна перекодировать видео, но должна выполнять быстрое копирование.

Заранее спасибо.

1 Ответ

0 голосов
/ 30 января 2020

ОК, поэтому ответ был просто: последняя версия VL C кажется глючной. То, что я сделал выше, прекрасно воспроизводится с очень небольшой паузой в точке вырезания в ffplay, mplayer и PotPlayer.

Следуя совету @ Gyan, я установил профиль и уровень в соответствии с оригиналом (используя -profile:v main -level:v 4), и даже небольшая пауза ушла.

ffmpeg -ss 698.698 -i "Concert.mp4" -ss 6.302 -t 3.708 -c:v libx264 -c:a copy -c:s copy -profile:v main -level:v 4 -y clipbegin.mp4
ffmpeg -ss 708.708 -to 1089.088 -i "Concert.mp4" -c copy -y clipmiddle.mp4
ffmpeg -ss 1089.088 -i "Concert.mp4" -t 5.912 -c:v libx264 -c:a copy -c:s copy -profile:v main -level:v 4 -y clipend.mp4
ffmpeg -f concat -i segments.txt -c copy -y artist.mp4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...