ffpmeg принудительно перезаписывает (плохо) обнаруженную частоту кадров ввода - PullRequest
0 голосов
/ 20 июня 2020

Я использую IP Webcam на Android, который обеспечивает видеопоток mpjpeg. Я должен ограничить частоту кадров захвата до 5 кадров в секунду, чтобы сэкономить на батарее.

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

Input #0, mpjpeg, from 'https://***:***@smarthome:8080/video':
  Duration: N/A, bitrate: N/A
    Stream #0:0: Video: mjpeg, yuvj420p(pc, bt470bg/unknown/unknown), 1280x720 [SAR 1:1 DAR 16:9], 25 tbr, 25 tbn, 25 tbc
Input #1, ogg, from 'https://***:***@smarthome:8080/audio.opus':
  Duration: N/A, start: 0.006500, bitrate: N/A
    Stream #1:0: Audio: opus, 48000 Hz, mono, fltp
    Metadata:
      ENCODER         : Lavf58.12.100
[stream_segment,ssegment @ 0x19b49a0] Opening '/mnt/nas/SecurityCamera/2020-06-20_14-26-04.mkv' for writing
Output #0, stream_segment,ssegment, to '/mnt/nas/SecurityCamera/%Y-%m-%d_%H-%M-%S.mkv':
  Metadata:
    encoder         : Lavf58.20.100
    Stream #0:0: Video: mjpeg, yuvj420p(pc, bt470bg/unknown/unknown), 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 25 tbr, 1k tbn, 25 tbc
    Stream #0:1: Audio: opus, 48000 Hz, mono, fltp
    Metadata:
      ENCODER         : Lavf58.12.100
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #1:0 -> #0:1 (copy)
Press [q] to stop, [?] for help
[ogg @ 0x1753e00] Thread message queue blocking; consider raising the thread_queue_size option (current value: 8)
frame=    8 fps=7.9 q=-1.0 size=N/A time=00:00:00.49 bitrate=N/A speed=0.489x

Как вы можете видеть, он обнаруживает, что вход № 0 равен 25 tbr, 25 tbn, 25 tb c, что дает ожидаемые 25 кадров в секунду, однако частота кадров в секунду (показанная сейчас высокая, но он медленно приближается к 5 кадрам в секунду) намного ниже 25, что приводит к тому, что скорость <1x. </p>

Я пытался использовать -r 5 -i ... и -vsync 2 и разные значения для -enc_time_base, ни одно из которых не имело никакого влияния. Из https://trac.ffmpeg.org/ticket/403 я узнал, что -r работает только с входами с неизвестной частотой кадров. Но у моего ввода нет неизвестных кадров в секунду, у него неправильные.

Есть ли способ принудительно перезаписать входные кадры в секунду, чтобы я мог получить правильную скорость 1x и синхронизированные временные метки и звук?

...