Замість використання -ssта -toпошуку параметрів, які здаються не дуже точними, чи можу я вирізати відео для заданих номерів кадрів? Наприклад;
ffmpeg -i video.webm -startingframe 80 -endingframe 560 output.webm
[80-й кадр та 560-й кадр включені. Отже, загалом (560 - 80 +1) кадрів]
Після відповідей і невеликого пошуку я спробував кілька команд. Але поки що я не міг знайти прийнятний спосіб.
Якщо хтось хоче скоротити відеопотік між 250-м та 750-м кадрами, це шлях. Це дасть 501 кадр як вихід:
Примітка: movie.mp4 має 25 кадрів в секунду, швидкість вибірки звуку - 48 к
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параметрів, щоб досягти найбільш точного різання. Але це шорсткий спосіб зробити це. Подивіться, будь ласка, на моєму першому дописі, я додав декілька командних