Loading BackendApp/ffmpeg.py +39 −22 Original line number Diff line number Diff line Loading @@ -2,29 +2,29 @@ import subprocess def prepare_transmission(data): script = ['ffmpeg', '-thread_queue_size', '4096'] video = data['video'] audio = data['audio'] if not (video['source'] or audio['source']): raise ValueError script = ['ffmpeg', '-hide_banner'] if video['source']: script += ['-thread_queue_size', '4096', '-probesize', '32', '-analyzeduration', '0'] if video['format']: script += ['-f', video['format']] if video['codec']: script += ['-input_format', video['codec']] if not video['source']: raise ValueError script += ['-i', video['source']] audio = data['audio'] script += ['-thread_queue_size', '4096'] if audio['source']: script += ['-thread_queue_size', '4096', '-probesize', '32', '-analyzeduration', '0'] if audio['format']: script += ['-f', audio['format']] if not audio['source']: raise ValueError audio_source = 'hw:' + audio['source'] script += ['-i', audio_source, '-hide_banner', '-probesize', '32', '-analyzeduration', '0'] script += ['-i', audio_source] codec = data['codec'] if codec['outputCodec'] == 'libx264': Loading Loading @@ -60,18 +60,21 @@ def prepare_playing(data): url = create_url('srt', data['url'], data['port'], data['srtOptions'], data['defaultSrt'], data['isServer'], False) script.append(url) # script = ' '.join(script) return start(script) def prepare_decklink(data): if not data['device']: raise ValueError url = create_url('srt', data['url'], data['port'], data['srtOptions'], data['defaultSrt'], data['isServer'], False) script = ['ffmpeg', '-thread_queue_size', '4096', '-i', url, data['device']] script = ['ffmpeg', '-thread_queue_size', '4096', '-probesize', '32', '-analyzeduration', '0', '-i', url, data['device']] return start(script) def create_url(protocol, url, port, options, default, server, sender, user, password): def create_url(protocol, url, port, options, default, server, sender, user=None, password=None): if default: if sender: options = 'pkt_size=1316&smoother=live&transtype=live&send_buffer_size=0&latency=0' Loading @@ -79,7 +82,10 @@ def create_url(protocol, url, port, options, default, server, sender, user, pass options = 'pkt_size=1316&smoother=live&transtype=live&recv_buffer_size=0&latency=0' if server: if options: options += '&mode=listener' else: options = 'mode=listener' url = '0.0.0.0' if protocol == 'srt': Loading @@ -102,6 +108,13 @@ def start(script): def get_video_devices(): result_devices = parse_v4l2_devices() result_devices += parse_decklink_devices() return result_devices def parse_v4l2_devices(): v4l2_devices = subprocess.run(['ffmpeg', '-hide_banner', '-sources', 'v4l2'], stdout=subprocess.PIPE).stdout Loading @@ -126,13 +139,17 @@ def get_video_devices(): split_info = one_format_info.split(': ') if len(split_info) >= 4: video_formats.append(split_info[1].strip()) video_sizes.append(split_info[3].strip()) video_sizes.append(split_info[3].strip().split()) result_devices.append( {'name': device, 'formats': video_formats, 'sizes': video_sizes, 'type': 'v4l2'}) return result_devices def parse_decklink_devices(): blackmagic_devices = subprocess.run(['ffmpeg', '-hide_banner', '-sources', 'decklink'], stdout=subprocess.PIPE).stdout result_devices = [] blackmagic_cleaned = [] for blackmagic_device in str(blackmagic_devices).split('\\n'): if blackmagic_device.startswith(' '): Loading Loading @@ -168,7 +185,7 @@ def get_audio_devices(): def get_output_devices(): blackmagic_devices = subprocess.run(['ffmpeg', '-hide_banner', '-sources', 'decklink'], blackmagic_devices = subprocess.run(['ffmpeg', '-hide_banner', '-sinks', 'decklink'], stdout=subprocess.PIPE).stdout result_devices = [] Loading BackendApp/main.py +8 −5 Original line number Diff line number Diff line Loading @@ -2,6 +2,7 @@ from typing import List from flask import Flask, request from flask_cors import CORS from subprocess import Popen import time import ffmpeg HOST = '' Loading Loading @@ -37,7 +38,6 @@ def play_on_blackmagic(): @app.route('/stop', methods=['POST']) def stop(): if len(FFMPEG_PROCESS) > 0: for process in FFMPEG_PROCESS: process.kill() FFMPEG_PROCESS.clear() Loading @@ -47,9 +47,12 @@ def stop(): @app.route('/restart', methods=['POST']) def restart(): for process in FFMPEG_PROCESS: script = process.args process.kill() ffmpeg.start(script) time.sleep(2) for process_index in range(len(FFMPEG_PROCESS)): process = FFMPEG_PROCESS[process_index] script = process.args FFMPEG_PROCESS[process_index] = ffmpeg.start(script) return "Success" Loading FrontendApp/my-app/src/App.tsx +5 −1 Original line number Diff line number Diff line Loading @@ -56,7 +56,7 @@ function App() { const [protocol, setProtocol] = useState('srt') const [port, setPort] = useState(12345) const [url, setUrl] = useState('') const [url, setUrl] = useState('localhost') const [defaultSrt, setDefaultSrt] = useState(true) const [srtSendOptions, setSrtSendOptions] = useState('pkt_size=1316&smoother=live&transtype=live&send_buffer_size=0&latency=0') const [srtRecvOptions, setSrtRecvOptions] = useState('pkt_size=1316&smoother=live&transtype=live&recv_buffer_size=0&latency=0') Loading @@ -77,6 +77,10 @@ function App() { setVideoDevices(response.data.video_devices) setAudioDevices(response.data.audio_devices) setOutputDevices(response.data.output_devices) setVideoSource(response.data.video_devices[0]?.name ?? '') setVideoCodec(response.data.video_devices[0]?.formats[0] ?? '') setAudioSource(response.data.audio_devices[0]?.device_number ?? '') setDecklinkOutput(response.data.output_devices[0]?.name ?? '') }) }, []) Loading FrontendApp/my-app/src/AudioSettingScreen.tsx +0 −6 Original line number Diff line number Diff line Loading @@ -20,12 +20,6 @@ export const AudioSettingScreen = ( devices: devices } : AudioProps ) => { useEffect( () => { if (devices.length >= 1) { setSource(devices[0].device_number) } }, [devices]) return ( <div className='Setting_Screen'> <div>Audio Source Loading FrontendApp/my-app/src/DecklinkOutput.tsx +2 −8 Original line number Diff line number Diff line Loading @@ -18,18 +18,12 @@ interface AvailableDevices { export const DecklinkOutputSettingScreen = ( { decklinkOutput: decklinkOutput, setDecklinkOutput: SetDecklinkOutput, setDecklinkOutput: setDecklinkOutput, outputToDecklink: outputToDecklink, setOutputToDecklink: setOutputToDecklink, devices: devices, }: OutputProps) => { useEffect( () => { if (devices.length >= 1) { SetDecklinkOutput(devices[0].name) } }, [devices]) return ( <div className='Setting_Screen'> Output To Blackmagic Loading @@ -37,7 +31,7 @@ export const DecklinkOutputSettingScreen = ( <select className="Setting_Screen_Item" defaultValue={decklinkOutput} onChange={event => SetDecklinkOutput(event.target.value)}> onChange={event => setDecklinkOutput(event.target.value)}> { devices.map((device) => ( <option value={device.name} key={device.name}>{device.name}</option> Loading Loading
BackendApp/ffmpeg.py +39 −22 Original line number Diff line number Diff line Loading @@ -2,29 +2,29 @@ import subprocess def prepare_transmission(data): script = ['ffmpeg', '-thread_queue_size', '4096'] video = data['video'] audio = data['audio'] if not (video['source'] or audio['source']): raise ValueError script = ['ffmpeg', '-hide_banner'] if video['source']: script += ['-thread_queue_size', '4096', '-probesize', '32', '-analyzeduration', '0'] if video['format']: script += ['-f', video['format']] if video['codec']: script += ['-input_format', video['codec']] if not video['source']: raise ValueError script += ['-i', video['source']] audio = data['audio'] script += ['-thread_queue_size', '4096'] if audio['source']: script += ['-thread_queue_size', '4096', '-probesize', '32', '-analyzeduration', '0'] if audio['format']: script += ['-f', audio['format']] if not audio['source']: raise ValueError audio_source = 'hw:' + audio['source'] script += ['-i', audio_source, '-hide_banner', '-probesize', '32', '-analyzeduration', '0'] script += ['-i', audio_source] codec = data['codec'] if codec['outputCodec'] == 'libx264': Loading Loading @@ -60,18 +60,21 @@ def prepare_playing(data): url = create_url('srt', data['url'], data['port'], data['srtOptions'], data['defaultSrt'], data['isServer'], False) script.append(url) # script = ' '.join(script) return start(script) def prepare_decklink(data): if not data['device']: raise ValueError url = create_url('srt', data['url'], data['port'], data['srtOptions'], data['defaultSrt'], data['isServer'], False) script = ['ffmpeg', '-thread_queue_size', '4096', '-i', url, data['device']] script = ['ffmpeg', '-thread_queue_size', '4096', '-probesize', '32', '-analyzeduration', '0', '-i', url, data['device']] return start(script) def create_url(protocol, url, port, options, default, server, sender, user, password): def create_url(protocol, url, port, options, default, server, sender, user=None, password=None): if default: if sender: options = 'pkt_size=1316&smoother=live&transtype=live&send_buffer_size=0&latency=0' Loading @@ -79,7 +82,10 @@ def create_url(protocol, url, port, options, default, server, sender, user, pass options = 'pkt_size=1316&smoother=live&transtype=live&recv_buffer_size=0&latency=0' if server: if options: options += '&mode=listener' else: options = 'mode=listener' url = '0.0.0.0' if protocol == 'srt': Loading @@ -102,6 +108,13 @@ def start(script): def get_video_devices(): result_devices = parse_v4l2_devices() result_devices += parse_decklink_devices() return result_devices def parse_v4l2_devices(): v4l2_devices = subprocess.run(['ffmpeg', '-hide_banner', '-sources', 'v4l2'], stdout=subprocess.PIPE).stdout Loading @@ -126,13 +139,17 @@ def get_video_devices(): split_info = one_format_info.split(': ') if len(split_info) >= 4: video_formats.append(split_info[1].strip()) video_sizes.append(split_info[3].strip()) video_sizes.append(split_info[3].strip().split()) result_devices.append( {'name': device, 'formats': video_formats, 'sizes': video_sizes, 'type': 'v4l2'}) return result_devices def parse_decklink_devices(): blackmagic_devices = subprocess.run(['ffmpeg', '-hide_banner', '-sources', 'decklink'], stdout=subprocess.PIPE).stdout result_devices = [] blackmagic_cleaned = [] for blackmagic_device in str(blackmagic_devices).split('\\n'): if blackmagic_device.startswith(' '): Loading Loading @@ -168,7 +185,7 @@ def get_audio_devices(): def get_output_devices(): blackmagic_devices = subprocess.run(['ffmpeg', '-hide_banner', '-sources', 'decklink'], blackmagic_devices = subprocess.run(['ffmpeg', '-hide_banner', '-sinks', 'decklink'], stdout=subprocess.PIPE).stdout result_devices = [] Loading
BackendApp/main.py +8 −5 Original line number Diff line number Diff line Loading @@ -2,6 +2,7 @@ from typing import List from flask import Flask, request from flask_cors import CORS from subprocess import Popen import time import ffmpeg HOST = '' Loading Loading @@ -37,7 +38,6 @@ def play_on_blackmagic(): @app.route('/stop', methods=['POST']) def stop(): if len(FFMPEG_PROCESS) > 0: for process in FFMPEG_PROCESS: process.kill() FFMPEG_PROCESS.clear() Loading @@ -47,9 +47,12 @@ def stop(): @app.route('/restart', methods=['POST']) def restart(): for process in FFMPEG_PROCESS: script = process.args process.kill() ffmpeg.start(script) time.sleep(2) for process_index in range(len(FFMPEG_PROCESS)): process = FFMPEG_PROCESS[process_index] script = process.args FFMPEG_PROCESS[process_index] = ffmpeg.start(script) return "Success" Loading
FrontendApp/my-app/src/App.tsx +5 −1 Original line number Diff line number Diff line Loading @@ -56,7 +56,7 @@ function App() { const [protocol, setProtocol] = useState('srt') const [port, setPort] = useState(12345) const [url, setUrl] = useState('') const [url, setUrl] = useState('localhost') const [defaultSrt, setDefaultSrt] = useState(true) const [srtSendOptions, setSrtSendOptions] = useState('pkt_size=1316&smoother=live&transtype=live&send_buffer_size=0&latency=0') const [srtRecvOptions, setSrtRecvOptions] = useState('pkt_size=1316&smoother=live&transtype=live&recv_buffer_size=0&latency=0') Loading @@ -77,6 +77,10 @@ function App() { setVideoDevices(response.data.video_devices) setAudioDevices(response.data.audio_devices) setOutputDevices(response.data.output_devices) setVideoSource(response.data.video_devices[0]?.name ?? '') setVideoCodec(response.data.video_devices[0]?.formats[0] ?? '') setAudioSource(response.data.audio_devices[0]?.device_number ?? '') setDecklinkOutput(response.data.output_devices[0]?.name ?? '') }) }, []) Loading
FrontendApp/my-app/src/AudioSettingScreen.tsx +0 −6 Original line number Diff line number Diff line Loading @@ -20,12 +20,6 @@ export const AudioSettingScreen = ( devices: devices } : AudioProps ) => { useEffect( () => { if (devices.length >= 1) { setSource(devices[0].device_number) } }, [devices]) return ( <div className='Setting_Screen'> <div>Audio Source Loading
FrontendApp/my-app/src/DecklinkOutput.tsx +2 −8 Original line number Diff line number Diff line Loading @@ -18,18 +18,12 @@ interface AvailableDevices { export const DecklinkOutputSettingScreen = ( { decklinkOutput: decklinkOutput, setDecklinkOutput: SetDecklinkOutput, setDecklinkOutput: setDecklinkOutput, outputToDecklink: outputToDecklink, setOutputToDecklink: setOutputToDecklink, devices: devices, }: OutputProps) => { useEffect( () => { if (devices.length >= 1) { SetDecklinkOutput(devices[0].name) } }, [devices]) return ( <div className='Setting_Screen'> Output To Blackmagic Loading @@ -37,7 +31,7 @@ export const DecklinkOutputSettingScreen = ( <select className="Setting_Screen_Item" defaultValue={decklinkOutput} onChange={event => SetDecklinkOutput(event.target.value)}> onChange={event => setDecklinkOutput(event.target.value)}> { devices.map((device) => ( <option value={device.name} key={device.name}>{device.name}</option> Loading