flandre/src/nodes/ImageFFMPEG.py

59 lines
2.1 KiB
Python
Raw Normal View History

2025-02-20 14:06:23 +08:00
import logging
import subprocess
import time
import numpy as np
import zmq
from BusClient import BusClient
from config import VIDEO_HEIGHT, VIDEO_WIDTH
from nodes.Node import Node
from utils.Msg import BMMsg, SetWindowVisibleMsg, Msg
logger = logging.getLogger(__name__)
class ImageFFMPEG(Node):
topics = [BMMsg, SetWindowVisibleMsg]
def __init__(self, level=logging.INFO):
super().__init__(level=level)
self.buffer = np.zeros((VIDEO_HEIGHT, VIDEO_WIDTH, 3), dtype=np.uint8) + 128
self.buffer = self.buffer.tobytes()
def loop(self):
self.c = BusClient(BMMsg, pub=False, conflare=True, poller=True)
p = subprocess.Popen(['ffmpeg',
'-f', 'rawvideo',
'-pixel_format', 'rgb24',
'-video_size', '1080x1920',
'-framerate', '60',
'-hwaccel', 'nvdec',
'-i', '-',
'-vcodec', 'h264_nvenc',
'-preset', 'faster',
'-pix_fmt', 'yuv420p',
# '-vcodec', 'libx264',
'-b:v', '40M',
'-f', 'flv',
'rtmp://localhost/live/livestream'
# '-f', 'mpegts',
# 'srt://localhost:10080?streamid=#!::r=live/livestream,m=publish'
],
stdin=subprocess.PIPE,
)
while True:
# socks = dict(self.c.poller.poll(1 / 30))
events = self.c.poller.poll(1)
if events:
msg: BMMsg = Msg.decode_msg(events[0][0].recv())
b = np.frombuffer(msg.data, dtype=np.uint8)
b = np.reshape(b, (VIDEO_HEIGHT, VIDEO_WIDTH, 4))[:, :, :3]
self.buffer = b.tobytes()
p.stdin.write(self.buffer)
time.sleep(1 / 60)
if __name__ == '__main__':
ImageFFMPEG()()