ffmpeg Неконотономный DTS, предыдущий DTS всегда одинаковый, потоковое аудио с микрофона

Вопрос или проблема

Я использую ffmpeg для потоковой передачи аудио с микрофона, используя RTP. Я использую Raspberry и внешнюю звуковую карту (HifiBerry DAC + ADC Pro). Моя цель — передавать аудио с минимальной задержкой другим Raspberry, которые будут воспроизводить аудио с помощью ffplay. Я стараюсь не сжимать аудиопоток и оставляю его в виде wav 48000 Hz. Я часто сталкиваюсь с ошибками Non Monotonous DTS. Когда это происходит, задержка увеличивается на сотни миллисекунд. Я пытался добавить флаг +igndts, но это ничего не меняет. Также пробовал флаг +genpts.

Что странно, предыдущий DTS всегда остается одинаковым (в примере ниже это 201165) и, кажется, не меняется. Я искал ответы на форумах, но не смог их найти.

Вот моя команда bash:

ffmpeg -guess_layout_max 0 -re -f alsa -i hw -acodec pcm_s16le -ac 1 -payload_type 10 -f rtp rtp://192.168.1.152:5003

И результат из терминала:

ffmpeg version 5.1.6-0+deb12u1+rpt1 Copyright (c) 2000-2024 the FFmpeg developers


built with gcc 12 (Debian 12.2.0-14)
  configuration: --prefix=/usr --extra-version=0+deb12u1+rpt1 --toolchain=hardened --incdir=/usr/include/aarch64-linux-gnu --enable-gpl --disable-stripping --disable-mmal --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libglslang --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librist --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sand --enable-sdl2 --disable-sndio --enable-libjxl --enable-neon --enable-v4l2-request --enable-libudev --enable-epoxy --libdir=/usr/lib/aarch64-linux-gnu --arch=arm64 --enable-pocketsphinx --enable-librsvg --enable-libdc1394 --enable-libdrm --enable-vout-drm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-libplacebo --enable-librav1e --enable-shared
  libavutil      57. 28.100 / 57. 28.100
  libavcodec     59. 37.100 / 59. 37.100
  libavformat    59. 27.100 / 59. 27.100
  libavdevice    59.  7.100 / 59.  7.100
  libavfilter     8. 44.100 /  8. 44.100
  libswscale      6.  7.100 /  6.  7.100
  libswresample   4.  7.100 /  4.  7.100
  libpostproc    56.  6.100 / 56.  6.100
Input #0, alsa, from 'hw':
  Duration: N/A, start: 1738663653.066577, bitrate: 1536 kb/s
  Stream #0:0: Audio: pcm_s16le, 48000 Hz, 2 channels, s16, 1536 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (pcm_s16le (native) -> pcm_s16le (native))
Press [q] to stop, [?] for help
Output #0, rtp, to 'rtp://192.168.1.152:5003':
  Metadata:
    encoder         : Lavf59.27.100
  Stream #0:0: Audio: pcm_s16le, 48000 Hz, mono, s16, 768 kb/s
    Metadata:
      encoder         : Lavc59.37.100 pcm_s16le
SDP:
v=0
o=- 0 0 IN IP4 127.0.0.1
s=No Name
c=IN IP4 192.168.1.152
t=0 0
a=tool:libavformat LIBAVFORMAT_VERSION
m=audio 5003 RTP/AVP 10
b=AS:768

[rtp @ 0x558b48ea90] Non-monotonous DTS in output stream 0:0; previous: 201165, current: 201160; changing to 201165. This may result in incorrect timestamps in the output file.
[rtp @ 0x558b48ea90] Non-monotonous DTS in output stream 0:0; previous: 201165, current: 201155; changing to 201165. This may result in incorrect timestamps in the output file.
[rtp @ 0x558b48ea90] Non-monotonous DTS in output stream 0:0; previous: 201165, current: 201149; changing to 201165. This may result in incorrect timestamps in the output file.
[rtp @ 0x558b48ea90] Non-monotonous DTS in output stream 0:0; previous: 201165, current: 201142; changing to 201165. This may result in incorrect timestamps in the output file.
[rtp @ 0x558b48ea90] Non-monotonous DTS in output stream 0:0; previous: 201165, current: 201134; changing to 201165. This may result in incorrect timestamps in the output file.
[rtp @ 0x558b48ea90] Non-monotonous DTS in output stream 0:0; previous: 201165, current: 201124; changing to 201165. This may result in incorrect timestamps in the output file.
[rtp @ 0x558b48ea90] Non-monotonous DTS in output stream 0:0; previous: 201165, current: 201114; changing to 201165. This may result in incorrect timestamps in the output file.
[rtp @ 0x558b48ea90] Non-monotonous DTS in output stream 0:0; previous: 201165, current: 201102; changing to 201165. This may result in incorrect timestamps in the output file.
[rtp @ 0x558b48ea90] Non-monotonous DTS in output stream 0:0; previous: 201165, current: 201089; changing to 201165. This may result in incorrect timestamps in the output file.
[rtp @ 0x558b48ea90] Non-monotonous DTS in output stream 0:0; previous: 201165, current: 201075; changing to 201165. This may result in incorrect timestamps in the output file.
[rtp @ 0x558b48ea90] Non-monotonous DTS in output stream 0:0; previous: 201165, current: 201060; changing to 201165. This may result in incorrect timestamps in the output file.
[rtp @ 0x558b48ea90] Non-monotonous DTS in output stream 0:0; previous: 201165, current: 201044; changing to 201165. This may result in incorrect timestamps in the output file.
[rtp @ 0x558b48ea90] Non-monotonous DTS in output stream 0:0; previous: 201165, current: 201027; changing to 201165. This may result in incorrect timestamps in the output file.
[rtp @ 0x558b48ea90] Non-monotonous DTS in output stream 0:0; previous: 201165, current: 201009; changing to 201165. This may result in incorrect timestamps in the output file.
[rtp @ 0x558b48ea90] Non-monotonous DTS in output stream 0:0; previous: 201165, current: 200990; changing to 201165. This may result in incorrect timestamps in the output file.
[rtp @ 0x558b48ea90] Non-monotonous DTS in output stream 0:0; previous: 201165, current: 200970; changing to 201165. This may result in incorrect timestamps in the output file.
[rtp @ 0x558b48ea90] Non-monotonous DTS in output stream 0:0; previous: 201165, current: 200949; changing to 201165. This may result in incorrect timestamps in the output file.

Я пытался добавить флаг +igndts, но это ничего не меняет. Также пробовал флаг +genpts. Я ожидал, что DTS восстановится сам, но проблема осталась прежней.

Ответ или решение

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

Теория

В мире обработки мультимедиа, DTS (Decoding Time Stamp) играет ключевую роль в синхронизации медиапотоков. Эти временные метки помогают медиа-проигрывателям правильно синхронизировать аудио и видео, обеспечивая воспроизведение без заиканий и задержек. В случае аудиостриминга через RTP протокол, как в вашем случае, DTS помогает упорядочивать пакеты данных при их получении и воспроизведении, особенно когда пакеты могут прибывать не по порядку.

Ошибка "Non-monotonous DTS" указывает на то, что текущая временная метка меньше предыдущей, что нарушает монотонный рост DTS, необходимый для корректной синхронизации потока.

Пример

Давайте рассмотрим ваш командный синтаксис и выходные данные. В вашей команде используется:

ffmpeg -guess_layout_max 0 -re -f alsa -i hw -acodec pcm_s16le -ac 1 -payload_type 10 -f rtp rtp://192.168.1.152:5003

Проблема, с которой вы столкнулись, может возникать из-за использования флага -re. Этот флаг искусственно ограничивает скорость обработки данных, симулируя реальное время. Это необходимо для проигрывания записанных файлов, но может вызвать некорректное поведение при стриминге аудио в реальном времени. Другая потенциальная точка сбоя — это сама конфигурация звуковой карты и настройки подхода к стримингу (например, формат вывода и частота дискретизации).

Решение

  1. Удалите флаг -re: Он потенциально добавляет ненужные задержки и такты, особенно когда вы стримите звук в реальном времени. Попробуйте его убрать и проверить, исчезает ли ошибка с DTS.

  2. Проверьте настройки звуковой карты: Убедитесь, что HifiBerry DAC + ADC Pro корректно настроена для работы с целью минимизации латентности. Это может включать обновление драйверов или изменение конфигурации в ALSA.

  3. Убедитесь в поддержке RTP: Проверьте сетевые условия и правильность обработки RTP-пакетов. Используйте инструменты мониторинга сети, чтобы убедиться в отсутствии потерь пакетов или задержек.

  4. Отключите -acodec pcm_s16le (если возможно): Позвольте ffmpeg автоматически определять кодеки, если это возможно. Это может позволяет ffmpeg более гибко применять оптимальные настройки.

  5. Используйте альтернативные флаги и параметры: Параметры как -fflags +igndts или -fflags +genpts могут только замаскировать проблему, но не решить её основную причину. Убедитесь, что для потоков и вывода используется подходящая синхронизация и буферизация.

  6. Измените частоту дискретизации: Если проблемы с синхронизацией продолжаются, попробуйте использовать другую частоту дискретизации вместо 48000 Hz и проверьте, поможет ли это устранить проблему.

Заключение

Проблемы с DTS часто связаны с синхронизацией временных меток и специфичными настройками потока. Удаление лишних флагов, проверка конфигурации оборудования и изменение сетевых настроек могут помочь вам устранить возникающие проблемы. Экспериментируйте с различными конфигурациями в ffmpeg, чтобы найти наиболее оптимальную для вашей конкретной архитектуры и условий стриминга.

Оцените материал
Добавить комментарий

Капча загружается...