9

Я хочу, чтобы мой сайт позволял пользователям точно создавать свои собственные клипы из исходного видео, которое я предоставляю.

У меня есть исходный видеофайл, который я сначала хочу преобразовать во что-то подходящее для веб-сайта:

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 секунды?

РЕДАКТИРОВАТЬ: Добавление -force_key_frames 00:00:00.2 не помогло.

РЕДАКТИРОВАТЬ: я изменил отсечение, чтобы использовать -c:v libx264 -c:a aac -strict experimental вместо -codec:v copy -codec:a copy с хорошими (ish) результатами.

Файл может воспроизводиться внешне без проблем - но когда я загружаю его в свой элемент видео html5 и воспроизводю его - последняя часть видео (аудио в порядке) зависает. Последняя часть, которая замирает, длится менее секунды.

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

Но подождите, разве тот факт, что он воспроизводится точно без проблем с таким проигрывателем, как MPC или Windows Media Player, не говорит о том, что это проблема либо с Google Chrome, либо с элементом HTML-видео? Или я использую неподдерживаемую кодировку или что-то?

1 ответ1

8

Поведение -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 . Это позволит переместить некоторые данные в начало файла, чтобы можно было начать воспроизведение до его полной загрузки.

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