Skip to content

Instantly share code, notes, and snippets.

@w495
Last active June 15, 2019 21:15
Show Gist options
  • Save w495/c4aa54e4783c2d3766407a5f4f7bc81d to your computer and use it in GitHub Desktop.
Save w495/c4aa54e4783c2d3766407a5f4f7bc81d to your computer and use it in GitHub Desktop.
Пример работы с видео в Python. Есть RTMP-поток и RTMP-сервер, на который нужно отправить этот поток. Создано по мотивам https://ru.stackoverflow.com/a/664973/203032
# -*- 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