1

Я хочу разделить длинный 50-минутный видеофайл на две 25-минутные части. Я наконец узнал, как транслировать один видеофайл в другой видеофайл через командную строку благодаря http://www.videolan.org/doc/streaming-howto/en/ch03.html и http://www.videolan. org/doc/streaming-howto/en/ch04.html документы.

Вот команда терминала, которую я использовал для достижения этой цели:

vlc original_video.mp4 --start-time 0 --stop-time 1500 --sout "#standard{access=file,mux=ts,dst=/home/max/Desktop/video_A.mp4}"

Единственная проблема заключается в том, что кажется, что VLC просто сидит и транслирует original_video.mp4 в video-A.mp4 . Я остановил его через 5 минут и увидел, что video_A.mp4 был всего 5 минут.

Есть ли способ ускорить этот процесс?

1 ответ1

0

Я хотел бы использовать ffmpeg «s сегмента мультиплексор (прокрутите немного вниз по этой ссылке для некоторых примеров). В принципе:

ffmpeg -i input.mp4 -c copy -f segment -segment_times 1500 output%02d.mp4

Это создаст два файла: «output01.mp4» и «output02.mp4». Если бы вы использовали output%03d.mp4 , вы бы вместо этого получили «output001.mp4» и «output002.mp4».

-segment_times вызывает разделенный запятыми список точек разделения, измеряемых в секундах. Поскольку вы хотите разделить только один раз, в 25 минут, просто используйте 1500 (= 25 * 60). Обратите внимание, что -segment_time (без 's') - это совершенно отдельный параметр - вы будете использовать его, если хотите разделить файл каждые пять секунд (например), без добавления большого списка каждого определенного времени.

Вы можете обнаружить, что вам нужно использовать -reset_timestamps 1 для правильного воспроизведения файлов:

ffmpeg -i input.mp4 -c copy -f segment -segment_times 1500 -reset_timestamps 1 output%02d.mp4

На странице документации намного больше опций. Это должно быть довольно быстро и без потерь (так что вы получите идентичное видео без лишних артефактов видео). Тем не менее, он не будет на 100% точным, поскольку ffmpeg нужно разделить на ключевой кадр, что не может быть гарантировано без перекодирования.

Если вам нужно точное разделение документация рекомендуется повторным кодированием и использование -force_key_frames и -segment_time_delta варианты для того , чтобы там будет I-кадры по времени мультиплексора сегмента будет пытаться разделить на (см также libx264 и AAC кодирование руководства по вики ffmpeg):

ffmpeg -i input.mp4 -c:v libx264 -crf 22 -preset veryfast -c:a libfdk_aac -vbr 3 \
-force_key_frames 1500 -f segment -segment_times 1500 -segment_time_delta 0.05 output%02d.mp4

Версия ffmpeg в большинстве репозиториев Linux будет довольно старой, а в случае с Debian и Ubuntu и др. Ситуация еще хуже: они предоставляют не ffmpeg, а скорее форк, avconv, из команды libav (см. также ответ лорда Неккорода здесь). AVconv - отличный инструмент сам по себе, но я не могу гарантировать, что синтаксис ffmpeg будет работать с ним 100% времени, особенно с такими «продвинутыми» вещами, как этот.

Я бы порекомендовал либо взять статическую сборку со страницы загрузок ffmpeg, либо скомпилировать ее самостоятельно. Основным преимуществом его компиляции является то, что вы можете получить доступ к libfdk_aac , лучшему аудиокодеру AAC, который может использовать ffmpeg - который не может быть легально распределен в скомпилированном двоичном файле ffmpeg из-за конфликтов лицензирования (fdk_aac использует пользовательскую лицензию с авторским левом, которая не совсем совместимо с GPL ffmpeg).

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