Как указать смещение и позицию поиска для видеопотока контейнера mp4? - PullRequest
2 голосов
/ 13 марта 2019

Похоже, у меня может быть один или другой (-ss или -itsoffset), но никогда оба одновременно, или они как бы взаимно отменяют друг друга.

Я создаю output.mp4с помощью этой команды:

ffmpeg -i input.mp3 -itsoffset 4 -t 4 -ss 3 -i input.mp4 -c:v copy output.mp4

С помощью этой команды я ожидаю, что звук начнет воспроизводиться сразу же, а видео начнет воспроизводиться через 4 секунды, а поиск начнется через 3 секунды.

Однако при воспроизведении файла input.mp4 видео начинается только на одну секунду позже, чем звук (в отличие от 4 секунд).Я предполагаю, что это делает тип «смещение - поиск = 1».

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

Приветствия!

Ответы [ 2 ]

0 голосов
/ 29 мая 2019

"Я ожидаю, что звук начнет воспроизводиться сразу же, а видео начнет воспроизводиться через 4 секунды,
(поиск через 3 секунды в видео).

Как это можно сделать без перекодирования ? "

Попробуйте использовать как:

ffmpeg -ss 00:00:03 -itsoffset 4 -i video.mp4 -ss 00:00:00 -i audio.mp3 -c:v copy output.mp4

Что означают команды (и их запись / порядок также важен) ...

-ss 00:00:03 = поиск в течение 3 секунд ввода video.mp4 для установки в качестве начальной точки вывода видео дорожка.

-itsoffset 4 = установить задержку перед воспроизведением входа как выхода. Дает неподвижный кадр в течение 4 секунд.

-i video.mp4 = установить видео вход в этот момент.

-ss 00:00:00 = поиск по 0 секундам ввода audio.mp4 в качестве начальной точки вывода аудио дорожка.

-i audio.mp3 = установить аудио вход на этом этапе ... ( см. Примечание к аудио ниже ).

-c:v copy = ( позволяет избежать перекодирования видео дорожки ).

output.mp4 = установить вывод a / v контейнер .

Примечания:

о видео: MPEG видео может только искать ключевые кадры (также называемые i-frames). Все может работать не так, как ожидалось, если вы установили -ss 3, в то же время используя -c:v copy, а ключевой кадр не был найден во время -ss.

Возможное отсутствие ключевого кадра в 3 секунды может объяснить ваше:

"Когда я играю input.mp4, видео начинается только на одну секунду позже, чем аудио
(в отличие от 4 секунд)"

Это даже предупреждение о в документах (см .: Страница вики FFmpeg - Ищу ).

Поиск при копировании кодека

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

В основном, если вы укажете «второй 157», а ключевой кадр не будет до второго 159, он будет включать в себя две секунды звука (без видео) в начале, а затем начнется с первого ключевого кадра.

So be careful when splitting and doing codec copy
.

Единственное решение - продолжать тестировать / корректировать значение видео -ss, чтобы найти следующий лучший компромисс.

  • Рассмотрите возможность использования формата времени HOURS:MM:SS.MILLISECONDS, чтобы приблизиться к ожидаемому 3 секунд. пример: -ss 00:00:02.895

об аудио: MP4 обычно имеет звуковую дорожку AAC. Обратите внимание, что, поскольку ваш входящий звук имеет формат MP3, он будет автоматически перекодирован в формат AAC с помощью FFmpeg.

  • Чтобы избежать перекодирования аудиоформата: принудительно вставьте MP3 с помощью -c:a copy
    (может быть добавлено после вышеуказанного -c:v copy).
0 голосов
/ 14 марта 2019

Как предположил Гьян, я заставил его работать, раздельно кодируя видеопоток с позицией поиска и продолжительностью:

ffmpeg -t 4 -ss 3 -i input.mp4 -c:v libx264 output.mp4

Затем смешивая его в окончательном формате .mp4 со смещением:

ffmpeg -i input.mp3 -itsoffset 4 -i input.mp4 -c:v copy output.mp4
...