Не удается исправить временную метку видео WebM с динамическим разрешением с помощью FFmpeg - PullRequest
0 голосов
/ 11 февраля 2019

Я разрабатываю платформу для 1-1 видеозвонков с записью.В моих целях я работаю со следующим стеком: WebRTC, Kurento Media Server, FFmpeg.

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

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

    Вот пример команды:

    ffmpeg -fflags +genpts -acodec libopus -vcodec libvpx \
        -i in.webm \
        -filter_complex "fps=30, setpts=PTS-STARTPTS" \
        -acodec libvorbis -vcodec libvpx \
        -vsync 1 -async 1 -r 30 -threads 4 out.webm
    
  2. После этого я столкнулся с еще одной проблемой.Если у пользователя плохое соединение, WebRTC может динамически изменять разрешение видео.После постобработки для такого типа видео (с различными разрешениями во время видео) я вижу замороженное изображение до конца видео, и оно началось с того момента, когда разрешение было динамически изменено.В журналах FFmpeg нет ошибок, только информация об изменении разрешения:

    [libvpx @ 0x559335713440] dimension change! 480x270 -> 320x180
    -async is forwarded to lavfi similarly to -af aresample=async=1:min_hard_comp=0.100000.
    

    После анализа журналов я понял, что проблема была в параметре STARTPTS, который после автоматического изменения расширениястал очень большим (равным количеству кадров, которые были до него).Я попытался удалить STARTPTS и оставить только PTS.

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

    Я пытался масштабировать видео до статического разрешения, прежде чем исправлять отметку времени, и это помогает.Но это немного дополнительная работа.Пример команды:

    ffmpeg -acodec libopus -vcodec libvpx \
        -i in.webm \
        -vf scale=640:480 \
        -acodec libvorbis -vcodec libvpx \
        -threads 4 out.webm
    

    Также я попытался объединить обе команды, используя filter_complex, но это не сработало.

    Я работал с FFmpeg не так много раз,так может я что то не так делаю?Может быть, есть несколько более простых способов сделать это?

    Поскольку Kurento использует GStreamer для записи видео, возможно, было бы лучше переконфигурировать Kurento для фиксации метки времени во время записи видео?

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

Я использую: Kurento Media Server 6.9.0, FFmpeg 4.1

...