3

Я обрабатываю загруженные пользователем видео на веб-сервере 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) загруженный клип

1б) конвертируется с помощью первой команды

1c) извлекается второй командой, пропуская первые шесть секунд

Для сравнения, этот второй клип взят с сайта Apple и не показывает проблему:

2а) загруженный клип

2b) конвертируется с помощью первой команды

2c) извлекается второй командой, без проблем

Кто-нибудь может увидеть, что отличает два исходных клипа? И если да, могу ли я что-то сделать в моей команде преобразования, чтобы при запуске команды извлечения клип настраивался так, чтобы избежать пропущенного видео?

Кстати, у меня изначально была проблема с ffmpeg 0.6.1, установленным с yum, но я обновился до последней версии git, и проблема остается.

1 ответ1

9

Предложение Мэтта о ключевых кадрах в сочетании со своевременной подсказкой, опубликованной в списке рассылки 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%, и это хороший компромисс для моего проекта.

Итак, я изменил мои две команды выше:

ffmpeg -i uploaded.mov -f mp4 -vcodec libx264 -vpre medium -acodec libfaac -r 15 -g 15 -b 360k -ab 48k -ar 22050 -s 480x320 formatted.mp4

ffmpeg -ss 0 -t 30 -i formatted.mp4 -vcodec copy -acodec copy formatted_sample.mp4

И все вроде хорошо. Если у кого-то есть более эффективное решение, пожалуйста, напишите, и я изменю свой выбранный ответ.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .