Всем привет, мы снова встретились, я ваш друг Цюаньчжаньцзюнь.
Когда мы разрабатываем сетевые программы, мы часто используем UDP или RTP для отправки и получения потокового мультимедиа. После завершения программы разработки нам необходимо настроить среду для тестирования. На этом этапе вам может понадобиться потоковый терминал или приемный терминал. Что касается потоковой передачи, мы можем легко выполнить эту функцию с помощью инструмента FFmpeg. Нам нужно всего лишь ввести команду для потоковой передачи, и она поддерживает несколько сетевых протоколов (UDP/RTP/RTSP/RTMP). На принимающей стороне мы можем использовать ffplay, который также находится в каталоге Bin набора инструментов FFmpeg. Вы можете использовать эти два инструмента для отправки или получения потоков в соответствии с вашими потребностями. На основе протоколов передачи UDP и RTP ниже будет описано использование этих двух инструментов в некоторых наиболее распространенных сценариях потоковой передачи.
1. Отправьте H264, используя RTP.
Команда push FFmpeg:
ffmpeg -re -i d:\videos\1080P.264 -vcodec copy -f rtp rtp://127.0.0.1:1234
Эта командная строка считывает файл H264, отправляет данные с частотой кадров, присущей исходному файлу (плюс параметр -re), а протокол выходного потока — rtp.
команда завершения приема ffplay:
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-вывода. Командная строка выглядит следующим образом:
ffmpeg -re -i d:\videos\1080P.264 -vcodec copy -f rtp rtp://127.0.0.1:1234>test_rtp_h264.sdp
Вот пример файла SDP:
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 открыл поток. Командная строка:
ffplay -protocol_whitelist "file,udp,rtp" -i test_rtp_h264.sdp
2. Используйте UDP для отправки потока TS.
Команда push FFmpeg:
ffmpeg -re -i d:\videos\1080P.264 -vcodec copy -f mpegts udp://127.0.0.1:1234
Команда приема ffplay:
ffplay -protocol_whitelist "file,udp,rtp" -i udp://127.0.0.1:1234
3. Используйте RTP для отправки потока TS.
Многие думают, что эта ситуация аналогична описанной выше, и используют следующую команду push (ошибка):
ffmpeg -re -i d:\videos\1080P.264 -vcodec copy -f mpegts rtp://127.0.0.1:1234
Но на самом деле это не сработало. Я начал использовать эту команду и пробовал ее много раз, но она всегда терпела неудачу. Причина неудачи заключалась в том, что в отправленном пакете не было заголовка RTP и протокол вывода был неправильным. На самом деле правильная команда:
ffmpeg -re -i d:\videos\1080P.264 -vcodec copy -f rtp_mpegts rtp://127.0.0.1:1234
Команды, полученные ffplay:
ffplay -protocol_whitelist "file,udp,rtp" -i rtp://127.0.0.1:1234
Или откройте файл SDP. Как файл SDP записывает поток TS:
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:
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:
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