Используйте командную строку FFmpeg для отправки потоков UDP и RTP (H264, TS) и получения их с помощью ffplay.
Используйте командную строку FFmpeg для отправки потоков UDP и RTP (H264, TS) и получения их с помощью ffplay.

Всем привет, мы снова встретились, я ваш друг Цюаньчжаньцзюнь.

Когда мы разрабатываем сетевые программы, мы часто используем UDP или RTP для отправки и получения потокового мультимедиа. После завершения программы разработки нам необходимо настроить среду для тестирования. На этом этапе вам может понадобиться потоковый терминал или приемный терминал. Что касается потоковой передачи, мы можем легко выполнить эту функцию с помощью инструмента FFmpeg. Нам нужно всего лишь ввести команду для потоковой передачи, и она поддерживает несколько сетевых протоколов (UDP/RTP/RTSP/RTMP). На принимающей стороне мы можем использовать ffplay, который также находится в каталоге Bin набора инструментов FFmpeg. Вы можете использовать эти два инструмента для отправки или получения потоков в соответствии с вашими потребностями. На основе протоколов передачи UDP и RTP ниже будет описано использование этих двух инструментов в некоторых наиболее распространенных сценариях потоковой передачи.

1. Отправьте H264, используя RTP.

Команда push FFmpeg:

Язык кода:javascript
копировать
ffmpeg -re -i d:\videos\1080P.264 -vcodec copy -f rtp rtp://127.0.0.1:1234

Эта командная строка считывает файл H264, отправляет данные с частотой кадров, присущей исходному файлу (плюс параметр -re), а протокол выходного потока — rtp.

команда завершения приема ffplay:

Язык кода:javascript
копировать
ffplay -protocol_whitelist "file,udp,rtp" -i rtp://127.0.0.1:1234

Примечание. Протокол RTP в ffplay по умолчанию не включен. Вам необходимо добавить параметр -protocol_whitelist, чтобы добавить протокол RTP в белый список. Однако при выполнении вышеуказанной команды могут возникнуть ошибки, поскольку ffplay использует протокол RTP для приема и требует файла SDP, который определяет информацию о формате входного потока, а также IP-адрес и номер порта принимающей стороны.

Мы можем позволить FFmpeg экспортировать SDP при выполнении push-вывода. Командная строка выглядит следующим образом:

Язык кода:javascript
копировать
ffmpeg -re -i d:\videos\1080P.264 -vcodec copy -f rtp rtp://127.0.0.1:1234>test_rtp_h264.sdp

Вот пример файла SDP:

Язык кода:javascript
копировать
SDP:
v=0
o=- 0 0 IN IP4 127.0.0.1
s=No Name
c=IN IP4 127.0.0.1
t=0 0
a=tool:libavformat 56.15.102
m=video 1234 RTP/AVP 96
a=rtpmap:96 H264/90000

(Информационное описание файла SDP: протокол передачи: RTP/AVP, IP-адрес получения: 127.0.0.1, номер порта приема: 1234, Тип полезной нагрузки: 96, формат видео: H264)

Используйте приведенный выше файл SDP в качестве входных данных, чтобы ffplay открыл поток. Командная строка:

Язык кода:javascript
копировать
ffplay -protocol_whitelist "file,udp,rtp" -i test_rtp_h264.sdp

2. Используйте UDP для отправки потока TS.

Команда push FFmpeg:

Язык кода:javascript
копировать
ffmpeg -re -i d:\videos\1080P.264 -vcodec copy -f mpegts udp://127.0.0.1:1234

Команда приема ffplay:

Язык кода:javascript
копировать
ffplay -protocol_whitelist "file,udp,rtp" -i udp://127.0.0.1:1234

3. Используйте RTP для отправки потока TS.

Многие думают, что эта ситуация аналогична описанной выше, и используют следующую команду push (ошибка):

Язык кода:javascript
копировать
ffmpeg -re -i d:\videos\1080P.264 -vcodec copy -f mpegts rtp://127.0.0.1:1234

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

Язык кода:javascript
копировать
ffmpeg -re -i d:\videos\1080P.264 -vcodec copy -f rtp_mpegts rtp://127.0.0.1:1234

Команды, полученные ffplay:

Язык кода:javascript
копировать
ffplay -protocol_whitelist "file,udp,rtp" -i rtp://127.0.0.1:1234

Или откройте файл SDP. Как файл SDP записывает поток TS:

Язык кода:javascript
копировать
SDP:
v=0
o=- 0 0 IN IP4 127.0.0.1
s=No Name
c=IN IP4 127.0.0.1
t=0 0
m=video 1234 RTP/AVP 33
a=rtpmap:33 MP2T/90000

(Примечание: тип полезной нагрузки RTP потока TS, отправленного FFmpeg, равен не 96, а 33)

Есть еще один вопрос:Ранние версии ffmpeg не поддерживают протокол вывода rtp_mpegts. Вы можете использовать команду ffmpeg -formats, чтобы проверить, поддерживает ли ffmpeg этот протокол вывода.Я используюFFmpegВерсияffmpeg-20180209Он поддерживает такого рода соглашение。

4. Используйте RTP для отправки аудиопотоков и видеопотоков отдельно.

Команда FFmpeg:

Язык кода:javascript
копировать
ffmpeg  -re -i <media_file> -an -vcodec copy -f rtp rtp://<IP>:5004 -vn -acodec copy -f rtp rtp://<IP>:5005 > test.sdp

Файлы SDP, полученные FFplay:

Язык кода:javascript
копировать
SDP:
v=2 
m=video 5004 RTP/AVP 96
a=rtpmap:96 H264
t=0 0 
a=framerate:25
c=IN IP4 192.168.0.100


m=audio 5005 RTP/AVP 97
a=rtpmap:97 PCM/8000/1
a=framerate:25
c=IN IP4 192.168.0.100

————————————————————————————————–

Представленный выше метод использует командную строку.

Издатель: Лидер стека программистов полного стека, укажите источник для перепечатки: https://javaforall.cn/147723.html Исходная ссылка: https://javaforall.cn

boy illustration
Учебное пособие по Jetpack Compose для начинающих, базовые элементы управления и макет
boy illustration
Код js веб-страницы, фон частицы, код спецэффектов
boy illustration
【новый! Суперподробное】Полное руководство по свойствам компонентов Figma.
boy illustration
🎉Обязательно к прочтению новичкам: полное руководство по написанию мини-программ WeChat с использованием программного обеспечения Cursor.
boy illustration
[Забавный проект Docker] VoceChat — еще одно приложение для мгновенного чата (IM)! Может быть встроен в любую веб-страницу!
boy illustration
Как реализовать переход по странице в HTML (html переходит на указанную страницу)
boy illustration
Как решить проблему зависания и низкой скорости при установке зависимостей с помощью npm. Существуют ли доступные источники npm, которые могут решить эту проблему?
boy illustration
Серия From Zero to Fun: Uni-App WeChat Payment Practice WeChat авторизует вход в систему и украшает страницу заказа, создает интерфейс заказа и инициирует запрос заказа
boy illustration
Серия uni-app: uni.navigateЧтобы передать скачок значения
boy illustration
Апплет WeChat настраивает верхнюю панель навигации и адаптируется к различным моделям.
boy illustration
JS-время конвертации
boy illustration
Обеспечьте бесперебойную работу ChromeDriver 125: советы по решению проблемы chromedriver.exe не найдены
boy illustration
Поле комментария, щелчок мышью, специальные эффекты, js-код
boy illustration
Объект массива перемещения объекта JS
boy illustration
Как открыть разрешение на позиционирование апплета WeChat_Как использовать WeChat для определения местонахождения друзей
boy illustration
Я даю вам два набора из 18 простых в использовании фонов холста Power BI, так что вам больше не придется возиться с цветами!
boy illustration
Получить текущее время в js_Как динамически отображать дату и время в js
boy illustration
Вам необходимо изучить сочетания клавиш vsCode для форматирования и организации кода, чтобы вам больше не приходилось настраивать формат вручную.
boy illustration
У ChatGPT большое обновление. Всего за 45 минут пресс-конференция показывает, что OpenAI сделал еще один шаг вперед.
boy illustration
Copilot облачной разработки — упрощение разработки
boy illustration
Микросборка xChatGPT с низким кодом, создание апплета чат-бота с искусственным интеллектом за пять шагов
boy illustration
CUDA Out of Memory: идеальное решение проблемы нехватки памяти CUDA
boy illustration
Анализ кластеризации отдельных ячеек, который должен освоить каждый&MarkerгенетическийВизуализация
boy illustration
vLLM: мощный инструмент для ускорения вывода ИИ
boy illustration
CodeGeeX: мощный инструмент генерации кода искусственного интеллекта, который можно использовать бесплатно в дополнение к второму пилоту.
boy illustration
Машинное обучение Реальный бой LightGBM + настройка параметров случайного поиска: точность 96,67%
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция без кодирования и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
LM Studio для создания локальных больших моделей
boy illustration
Как определить количество слоев и нейронов скрытых слоев нейронной сети?
boy illustration
[Отслеживание целей] Подробное объяснение ByteTrack и детали кода