Страницы

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

четверг, 23 января 2020 г.

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

#php #python #потоки_данных #streaming #rtmp


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


Ответы

Ответ 1



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.

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

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