Вместо использования -ss
и -to
поиска параметров, которые кажутся не очень точными, могу ли я вырезать видео для заданных номеров кадров? Например;
ffmpeg -i video.webm -startingframe 80 -endingframe 560 output.webm
[80-й кадр и 560-й кадр включены. Таким образом, в сумме получается (560 - 80 +1) кадров]
После ответов и немного поиска, я попробовал несколько команд. Но пока я не мог найти приемлемый путь.
Если кто-то хочет сократить поток видео между 250-м и 750-м кадрами, это путь. Это даст 501 кадр в качестве вывода:
Примечание: movie.mp4 имеет 25 кадров в секунду и частоту дискретизации звука 48k
ffmpeg -i movie.mp4 -an -vf "select=between(n\,250\,750),setpts=PTS-STARTPTS" v_stream.webm
Как и ожидалось, выходная длина составляет ровно 20 секунд.
Используя тот же метод для аудио:
ffmpeg -i movie.mp4 -vn -af "aselect=between(n\,480\,1440),setpts=PTS-STARTPTS" a_stream.webm
Неожиданно этот имеет очень плохую точность. Он должен был дать мне 960001 (960k + 1) сэмплов, что равняется 20 секундам звука. Но вместо этого результат был 20,505 секунд и имеет 984240 сэмплов. Также, если я увеличу продолжительность, увеличится и ошибка.
Затем я попытался использовать параметры -ss -to для обрезки аудиопотока:
ffmpeg -i movie.mp4 -vn -ss 10.000 -to 30.000 a_stream.webm
Старый классический способ работает намного лучше. Выход был 20.003 секунд и 960144 сэмплов. Плюс, увеличение продолжительности не увеличивает ошибку, ошибка постоянна, всегда есть 144 выборки излишков с этим входным файлом.
Подводя итог:
select
фильтр работает хорошо в большинстве случаев, но выбор нет. Классические -ss
параметры работают лучше для аудио, но не с точностью до сэмпла. Кроме того, невозможно использовать -vf select
и -ss
параметры вместе, потому что -ss
это повлияет как на аудио, так и на видео потоки, в то время как мы хотим, чтобы это влияло только на аудио.
Итак, чтобы точно вырезать медиа-файл, я должен сделать эти 3 шага:
ffmpeg -i movie.mp4 -an -vf "select=between(n\,250\,750),setpts=PTS-STARTPTS" v_stream.webm
ffmpeg -i movie.mp4 -vn -ss 10.000 -to 30.000 a_stream.webm
ffmpeg -i v_stream.webm -i a_stream.webm -c:v copy -c:a copy movie-between_10th_and 20th_seconds.webm
Это дает наиболее точные результаты. Продолжительность видео составляет 20 000 секунд, а качество кадра - 20,003 секунды, сэмпл 960144. Не совсем совпадает с видео потоком, но это нормально. Существует только 144 излишков образцов. Самым большим недостатком является то, что когда я хочу вырезать файл, мне нужно отправить 3 команды для простой работы, и он создает два ненужных файла: a_stream.webm и v_stream.webm. И select
фильтр не работает на некоторых входных файлах, которые я пробовал. Он выполняет работу успешно (?), Но никогда не останавливает процесс кодирования, поэтому мне приходится каждый раз закрывать командную строку.
select
и aselect
фильтры для видео и аудио потоков. Select
с точностью до кадра для видео, но aselect
не с точностью до выборки. На самом деле это далеко не так. Это дает гораздо худшие результаты, чем использование простых параметров -ss
-to
. Из-за этого на данный момент я использую комбинацию select
фильтра и -ss
-to
параметров, чтобы добиться наиболее точной резки. Но это безобразный способ сделать это. Пожалуйста, посмотрите на мой первый пост, я добавил некоторые