2

ffmpeg может использоваться для объединения файлов:

Если у вас есть медиа-файлы с одинаковыми параметрами кодека и кодека, вы можете объединить их [...]

(выделение мое) Мое намерение 1 состоит в том, чтобы создавать мультимедийные файлы с тем же кодеком и параметрами, чтобы я мог воспользоваться преимуществами concat, не подвергаясь длительному перекодированию.

Преамбула:

У меня есть файл, который я хотел бы вырезать и сохранить полезные части. Я написал скрипт на python, чтобы найти ближайший ключевой кадр к желаемой точке вырезания и вырезать там, так как при выполнении потоковой копии ffmpeg может использовать только I-кадры:

Использование -ss в качестве параметра ввода вместе с -c:v копирование может быть неточным, поскольку ffmpeg вынужден использовать / разбивать только на i-кадрах.

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

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

Базовая диаграмма, вероятно, поможет проиллюстрировать это:

  [111AAAA111BBBBB111111CCCCCCC1111DDDDD111]   | (original file)
     [AAAA] [BBBBB]    [CCCCCCC]  [DDDDD]      | (desired clips extracted)
[AAA] [A][B] [BBB] [B][C] [CCCCC] [C][D] [DDDD]| (split ends from clips)
      [AAA][ab][BBB][bc][CCCCC][cd][DDD]       | (transitions between short ends)
            [AAAabBBBbcCCCCCcdDDD]             | (intended output)

Проблема:

Вот куда я попал. Когда я использовал concat ffmpeg concat чтобы присоединиться к вышеупомянутым клипам, я получаю значительные видео и аудио артефакты при воспроизведении. Я предполагаю, что есть несоответствие в параметрах кодека, как отмечено как обязательное условие наверху этого вопроса. Итак, проверка видео с помощью ffprobe дает:

$ ffprobe -i ab-transition.mkv 2>&1 | grep Stream.*Video ; ffprobe -i B.mkv 2>&1 | grep Stream.*Video
Stream #0:0: Video: h264 (Main), yuv420p(tv, bt709/bt709/iec61966-2-1), 1280x720, SAR 1:1 DAR 16:9, 62.50 fps, 62.50 tbr, 1k tbn, 120 tbc (default)
Stream #0:0: Video: h264 (Main), yuv420p(tv, bt709/bt709/iec61966-2-1), 1280x720 [SAR 1:1 DAR 16:9], 62.50 fps, 62.50 tbr, 1k tbn, 125 tbc (default)

(Я пропустил вывод аудиопотока, так как потоки имеют якобы одинаковые параметры, но звук не соединен правильно)

Есть отличия. Я использовал -show_streams для получения более подробной информации, которая доступна по адресу http://pastebin.com/4vcnDYtj (одна пустая строка, разделяющая 2 выхода). diff выходных данных дает:

7c7
< codec_time_base=1/120
---
> codec_time_base=1/125
70,71c70,71
< start_pts=12
< start_time=0.012000
---
> start_pts=11
> start_time=0.011000

Обновить:

Я нашел параметры и подходящие параметры для всего, что я вижу, кроме временной базы кодека (tbc). Есть ли настройка, которая позволит мне установить codec_time_base (tbc)? Установка -r имеет никакого эффекта.

Обновление 2: опасаясь, что этот вопрос будет слишком нишевым для SU, я задал вопрос о списке рассылки ffmpeg-user. К сожалению, -time_base не подходит в этом случае:

Это опция для внутренних кодеров FFmpeg, которые вы пытаетесь использовать для внешнего кодера (x264).

И еще, к сожалению, когда я спросил об общей осуществимости, ответ был

Я не думаю, что это возможно.

Я попросил разъяснений и возможностей, связанных с оригинальным программным обеспечением для кодирования - в данном случае OBS - которое потенциально менее гибко в спецификации опций, чем ffmpeg из-за необходимости соответствовать спецификациям формата живого потока (Twitch). Я еще не получил ответ из списка рассылки, но спрашивал и на форумах OBS.

Еще более важно, будет контролировать для них позволяет мне использовать concat демультиплексор в ffmpeg , чтобы присоединиться к этим вместе без необходимости длительного процесса кодирования? Спасибо заранее.

(Я понимаю, что это текстовая стена, поэтому дополнения, вычитания или уточнения, конечно, приветствуются. Я бы дал ссылку на более официальную информацию, но, будучи <10 представителей, я не могу включать более 2 ссылок!)


1: Для получения дополнительной информации см. Мой связанный вопрос: как эффективно и автоматически объединять видеоклипы с помощью коротких переходов?

1 ответ1

1

В соответствии с общими параметрами кодека, вы можете добавить -time_base к набору кодировщиков libx264 во время создания переходных клипов.

Если я правильно читаю ваши сравнения файлов - ab-transition.mkv показывает tcb 1/120, а B.mkv показывает 1/125 (какое значение вы хотите, верно?) - я бы предложил включая значение -r чтобы убедиться, что поддерживаются как частота кадров, так и время:

-c:v libx264 [preset & crf/qp settings] -r 62.50 -time_base 1/125 [output]

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

-c:v -libx264 -preset ultrafast -qp 0 -c:a pcm_s16le

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

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