Я обрабатываю загруженные пользователями видео на веб-сервере CentOS с помощью ffmpeg. Мне нужно преобразовать каждое видео в стандартный размер и формат, а затем извлечь 30-секундный образец клипа из каждого видео. Я хочу использовать флаг «-vcodec copy» в команде извлечения, чтобы избежать повторного кодирования.
Эта команда работает для моего первоначального преобразования:
ffmpeg -i uploaded.mov -f mp4 -vcodec libx264 -vpre medium -acodec libfaac -r 15 -b 360k -ab 48k -ar 22050 -s 480x320 formatted.mp4
И это иногда работает для извлечения:
ffmpeg -i formatted.mp4 -vcodec copy -acodec copy -ss 0 -t 30 formatted_sample.mp4
Однако, когда я запускаю команду извлечения для некоторых видео, извлеченный образец клипа начинается с нескольких секунд пустого видео. Звук начинается сразу же, но видео не начинается в течение 3-6 секунд.
Чтобы продемонстрировать проблему, я загрузил два видеоклипа и выполнил над ними указанные выше команды. Я создал первый клип в Final Cut Express и закодировал его с помощью Handbrake перед загрузкой на веб-сервер:
1a) загруженный клип
1b) конвертируется с помощью первой команды
1c) извлекается второй командой, пропуская первые шесть секунд
Для сравнения, этот второй клип взят с сайта Apple и не показывает проблему:
2а) загруженный клип
2b) конвертируется с помощью первой команды
2c) извлекается второй командой, без проблем
Кто-нибудь может увидеть, что отличается от двух исходных клипов? И если да, могу ли я что-то сделать в моей команде преобразования, чтобы при запуске команды извлечения клип настраивался так, чтобы избежать пропущенного видео?
Кстати, у меня изначально была проблема с ffmpeg 0.6.1, установленным с yum, но я обновился до последней версии git, и проблема остается.
источник
Ответы:
Предложение Мэтта о ключевых кадрах в сочетании со своевременной подсказкой, опубликованной в списке рассылки ffmpeg, привело меня к решению, хотя я не уверен, что это лучшее решение.
Сначала мне пришлось переместить опции -ss и -t в моей команде извлечения, чтобы они появились перед опцией -i. Это приводит к тому, что извлечение начинается на следующем самом раннем ключевом кадре. Допустим, я использую -ss 25 -t 15 для извлечения от 0:25 до 0:40 в моем клипе, но у меня есть ключевые кадры каждые 10 секунд. Ранее я получал 15-секундный образец, начиная с 5 секунд чистого видео. Теперь я получу 20-секундный семпл с 0:20 до 0:40, но без пустого видео. Другими словами, я избегаю пустого видео, но теряю точность выбора клипа.
Чтобы решить эту проблему, мне пришлось добавить опцию -g к моей команде преобразования, чтобы переформатировать ключевые кадры. Я использовал -g 15 с -r 15 для создания ключевого кадра каждую секунду. Это позволяет мне выбирать места выборки с точностью до секунды, поэтому -ss 25 -t 15 даст мне 15-секундный клип, который я просил. Я ожидаю, что дополнительные ключевые кадры сделают мой полный клип больше, но в моих тестах он увеличится только примерно на 2%, и это хороший компромисс для моего проекта.
Итак, я изменил мои две команды выше:
И все вроде хорошо. Если у кого-то есть более эффективное решение, пожалуйста, напишите, и я изменю свой выбранный ответ.
источник
ss
иt
вариантов приведет к разным результатам.