Страницы

Поиск по вопросам

вторник, 19 марта 2019 г.

Как организовать рестрим rtmp?

У меня есть rtmp поток и rtmp сервер, на который нужно отправить этот поток с определенным именем. Как лучше всего это можно организовать?(желательно на php или python, хотя можно и со сторонними утилитами)


Ответ

Cо сторонними утилитами
Подобного проще всего достичь с помощью FFMpeg:
/usr/bin/ffmpeg -re \ -i 'rtmp://src_stream:1935/play' \ -vcodec copy -acodec copy \ -f flv 'rtmp://dst_stream:1935/publish';
Например, эту командочку, можно было бы вызвать из любого удобного вам окружения.
Более подробно про команды рассказано тут:
FFmpeg Streaming Guide FFmpeg for streaming Онлайн вещание через Nginx-RTMP — несколько готовых рецептов Про аргументы командной строки FFMpeg
Можно пойти немного дальше, и использовать nginx c nginx-rtmp-module
Streaming with nginx-rtmp-module Getting started with nginx RTMP Attempting to Stream a Webcam to an RTMP Server nginx-rtmp-module wiki: exec_push
При этом nginx.conf всего скорее будет иметь вид:
#user nobody; worker_processes 1;
error_log logs/error.log debug;
events { worker_connections 1024; }
rtmp { server { listen 1935; ping 30s; notify_method get;
application src { live on; exec_push ffmpeg -i 'rtmp://src_stream:1935/play' -vcodec copy -acodec copy -f flv 'rtmp://dst_stream:1935/publish' 2>> '/var/log/ffmpeg-$name.log'; } } }
Hа python
Решение на Python легко организовать через PyAV. Это питонячие биндинги к libav
О том что это такое и как это использовать можно почитать тут:
Про обработку видео в Python
Про работу с RTMP в PyAV есть комментарий автора проекта:
Can I use PyAV to built a RTMP retransmit-server?
Пример
https://gist.github.com/w495/c4aa54e4783c2d3766407a5f4f7bc81d
import av
# Откроем ресурс на чтение input_resource = av.open( 'rtmp://src_stream:1935/play' ) # Откроем ресурс на запись. output_resource = av.open( 'rtmp://dst_stream:1935/publish', mode='w', format='flv' ) # Список потоков входного ресурса: видео и аудио input_streams = list() # Список потоков выходного ресурса: видео и аудио output_streams = list() # Для входного и выходного ресурсов возьмём поток видео. for stream in input_resource.streams: if stream.type == 'video': input_streams += [stream] # Создадим видео-поток для выходного ресурса. Кодек `h264`. output_streams += [output_resource.add_stream('h264')] break # Для входного и выходного ресурсов возьмём поток аудио. for stream in input_resource.streams: if stream.type == 'audio': input_streams += [stream] # Создадим аудио-поток для выходного ресурса. Кодек `aac`. output_streams += [output_resource.add_stream('aac')] break # В этом списке будем хранить пакеты выходного потока. output_packets = list() # Применим «инверсное мультиплексирование». Получим пакеты из потока. for packet in input_resource.demux(input_streams): # Получим все кадры пакета. for frame in packet.decode(): # Сбросим PTS для самостоятельного вычислении при кодировании. frame.pts = None # Закодируем соответствующие кадры для выходных потоков. for stream in output_streams: if packet.stream.type == stream.type: output_packets += [stream.encode(frame)] # Сбросим буфферы кодировщика. ??? Нужно ли ??? for stream in output_streams: output_packets += [stream.encode(None)] # Для каждого пакета применим «прямое мультиплексирование». for packet in output_packets: if packet: output_resource.mux(packet) output_resource.close()
Это немного искусственный пример, и нужно помнить про некоторые особенности потокового видео. В частности, — оно потенциально бесконечно, и это означает, что вы не сможете использовать списки пакетов и кадров (list). В вашей задаче, всего скорее, будут нужны генераторы последовательностей и итераторы:
Python Practice Book: Iterators & Generators Python wiki: Iterator Python wiki: Generators

Комментариев нет:

Отправить комментарий