Вопрос или проблема
Я использую 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
. Этот флаг искусственно ограничивает скорость обработки данных, симулируя реальное время. Это необходимо для проигрывания записанных файлов, но может вызвать некорректное поведение при стриминге аудио в реальном времени. Другая потенциальная точка сбоя — это сама конфигурация звуковой карты и настройки подхода к стримингу (например, формат вывода и частота дискретизации).
Решение
-
Удалите флаг
-re
: Он потенциально добавляет ненужные задержки и такты, особенно когда вы стримите звук в реальном времени. Попробуйте его убрать и проверить, исчезает ли ошибка с DTS. -
Проверьте настройки звуковой карты: Убедитесь, что HifiBerry DAC + ADC Pro корректно настроена для работы с целью минимизации латентности. Это может включать обновление драйверов или изменение конфигурации в ALSA.
-
Убедитесь в поддержке RTP: Проверьте сетевые условия и правильность обработки RTP-пакетов. Используйте инструменты мониторинга сети, чтобы убедиться в отсутствии потерь пакетов или задержек.
-
Отключите
-acodec pcm_s16le
(если возможно): Позвольте ffmpeg автоматически определять кодеки, если это возможно. Это может позволяет ffmpeg более гибко применять оптимальные настройки. -
Используйте альтернативные флаги и параметры: Параметры как
-fflags +igndts
или-fflags +genpts
могут только замаскировать проблему, но не решить её основную причину. Убедитесь, что для потоков и вывода используется подходящая синхронизация и буферизация. -
Измените частоту дискретизации: Если проблемы с синхронизацией продолжаются, попробуйте использовать другую частоту дискретизации вместо 48000 Hz и проверьте, поможет ли это устранить проблему.
Заключение
Проблемы с DTS часто связаны с синхронизацией временных меток и специфичными настройками потока. Удаление лишних флагов, проверка конфигурации оборудования и изменение сетевых настроек могут помочь вам устранить возникающие проблемы. Экспериментируйте с различными конфигурациями в ffmpeg, чтобы найти наиболее оптимальную для вашей конкретной архитектуры и условий стриминга.