Last active
June 15, 2019 21:15
-
-
Save w495/c4aa54e4783c2d3766407a5f4f7bc81d to your computer and use it in GitHub Desktop.
Пример работы с видео в Python. Есть RTMP-поток и RTMP-сервер, на который нужно отправить этот поток. Создано по мотивам https://ru.stackoverflow.com/a/664973/203032
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf8 -*- | |
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() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment