%20%D1%81%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E%20ffmpeg.png)
Я хочу, чтобы мой сайт позволял пользователям создавать собственные клипы из предоставленного мной исходного видео.
У меня есть исходный видеофайл, который я сначала хочу преобразовать в формат, подходящий для веб-сайта:
Input #0, matroska,webm, from 'source.mkv':
Duration: 00:28:18.57, start: 0.000000, bitrate: 10183 kb/s
Stream #0:0: Video: h264 (Constrained Baseline), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 1k tbn, 48 tbc (default)
Stream #0:1: Audio: mp3, 44100 Hz, stereo, s16, 128 kb/s (default)
Я использую ffmpeg для конвертации следующим образом:
ffmpeg -i source.mkv -c:v libx264 -c:a aac -strict experimental -vf scale="960:-1" source.mp4
Пересматривая это видео, я вижу, что оно достаточно хорошего качества и достаточно маленького размера для моих нужд, и загружается/воспроизводится на моем веб-сайте.
У меня есть веб-страница, которая позволяет пользователям выбирать начальную и конечную точку этого видео и создавать клип. Вот пример команды ffmpeg, которую я для этого использую:
-ss 577.920 -i source.mp4 -t 011.980 -codec:v copy -codec:a copy -vf scale="960:-1" clip1.mp4
Проблема в том, что клип не всегда достаточно точный по времени. Обычно звук достаточно точный, но видео останавливается на полсекунды раньше или около того.
Есть ли способ сделать это точно и синхронно, скажем, с точностью до 0,2 секунды?
EDIT: Добавление -force_key_frames 00:00:00.2
не помогло.
ПРАВКА: Я изменил вырезку, чтобы использовать -c:v libx264 -c:a aac -strict experimental
вместо -codec:v copy -codec:a copy
с хорошими (более) результатами.
Файл может воспроизводиться внешне без проблем, но когда я загружаю его в свой элемент html5 video и воспроизводю его, последняя часть видео (со звуком все в порядке) замирает. Последняя часть, которая замирает, длится меньше секунды.
Стоит ли мне попробовать его с другим видеокодером? Какая лучшая альтернатива для libx264? Имея в виду, что я, вероятно, захочу, чтобы это было на публичном сайте.
Но подождите, разве тот факт, что он воспроизводится точно и без проблем с проигрывателем вроде MPC или Windows Media Player, не говорит о том, что проблема либо в Google Chrome, либо в элементе HTML video? Или я использую неподдерживаемую кодировку или что-то еще?
решение1
Поведение -ss
меняется в зависимости от того, используется ли он как входной или выходной параметр, и часто медленнее, но может быть более точным при использовании как выходной параметр. См. ответ наffmpeg медленно конвертирует видео из указанного периода временидля получения более подробной информации и примеров.
Чтобы изменить качество вывода, source.mp4
используйте -crf
параметр со значением от 18 до 28 (по умолчанию 23). См. раздел CRFРуководство по кодированию FFmpeg и x264Например.
Команду обрезки можно упростить:
ffmpeg -ss 577.92 -i source.mp4 -ss 0 -t 11.98 -c copy -map 0 clip1.mp4
Я заменил -codec:v copy -codec:a copy
на -c copy -map 0
. Это скопирует все потоки, а не только первые видео- и аудиопотоки, хотя на входе только два потока из-за вашей предыдущей команды. Поскольку вы не можете масштабировать без перекодирования, следовательно, это взаимоисключающе с -codec:v copy
, и поскольку ваш вход уже масштабирован до установленного размера, я удалил параметры фильтра.
Если результат все еще недостаточно точен, попробуйте:
ffmpeg -i source.mp4 -ss 577.92 -t 11.98 -c copy -map 0 clip1.mp4
Это будет медленнее, но, вероятно, точнее. Смотрите ссылки в ответе в первой ссылке, которую я предоставил, для описания различий этих двух примеров.
Наконец, вы должны запустить source.mp4
( qt-faststart
находится в каталоге tools в исходнике ffmpeg), или использовать опцию -movflags faststart
. Это переместит некоторые данные в начало файла, чтобы он мог начать воспроизведение до того, как будет полностью загружен.