У меня есть 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
Комментариев нет:
Отправить комментарий