116 lines
3.1 KiB
Python
116 lines
3.1 KiB
Python
import random
|
|
from aiortc.contrib.media import MediaBlackhole, MediaPlayer, MediaRecorder, MediaRelay
|
|
from aiortc import MediaStreamTrack, VideoStreamTrack, AudioStreamTrack
|
|
|
|
class MyMediaPlayer(MediaPlayer):
|
|
pass
|
|
|
|
class MyTrackBase:
|
|
def __init__(self, source=None):
|
|
self.source = source
|
|
self.set_source_track()
|
|
print(f'{self.kind=}, {self.__class__.__name__}, {dir(self)}')
|
|
|
|
def set_source_track(self):
|
|
if self.kind == 'audio':
|
|
self.track = self.source.audio
|
|
else:
|
|
self.track = self.source.video
|
|
|
|
def source_reload(self):
|
|
print(f'reload the source----{self.source._file_path}')
|
|
self.set_source(MyMediaPlayer(self.source._file_path))
|
|
|
|
def set_source(self, source):
|
|
self.source = source
|
|
self.set_source_track()
|
|
|
|
async def recv(self):
|
|
print(f'============{self.__class__.__name__}, {self.source.duration=}, {self.source.time=}')
|
|
if self.source is None:
|
|
return None
|
|
if self.track.readyState != 'live':
|
|
self.source_reload()
|
|
f = await self.track.recv()
|
|
return f
|
|
|
|
|
|
class MyAudioStreamTrack(AudioStreamTrack):
|
|
def __init__(self, source=None):
|
|
super().__init__()
|
|
self.source = source
|
|
self.set_source_track()
|
|
print(f'{self.kind=}, {self.__class__.__name__}, {dir(self)}')
|
|
|
|
async def recv(self):
|
|
print(f'============{self.__class__.__name__}, {self.source.duration=}, {self.source.time=}')
|
|
if self.source is None:
|
|
return None
|
|
if self.track.readyState != 'live':
|
|
self.source_reload()
|
|
f = await self.track.recv()
|
|
return f
|
|
|
|
def set_source_track(self):
|
|
if self.kind == 'audio':
|
|
self.track = self.source.audio
|
|
else:
|
|
self.track = self.source.video
|
|
|
|
def source_reload(self):
|
|
print(f'reload the source----{self.source._file_path}')
|
|
self.set_source(MyMediaPlayer(self.source._file_path))
|
|
|
|
def set_source(self, source):
|
|
self.source = source
|
|
self.set_source_track()
|
|
|
|
class MyVideoStreamTrack(VideoStreamTrack):
|
|
def __init__(self, source=None):
|
|
super().__init__()
|
|
self.source = source
|
|
self.set_source_track()
|
|
print(f'{self.kind=}, {self.__class__.__name__}, {dir(self)}')
|
|
|
|
async def recv(self):
|
|
print(f'============{self.__class__.__name__}, {self.source.duration=}, {self.source.time=}')
|
|
if self.source is None:
|
|
return None
|
|
if self.track.readyState != 'live':
|
|
self.source_reload()
|
|
f = await self.track.recv()
|
|
return f
|
|
|
|
def set_source_track(self):
|
|
if self.kind == 'audio':
|
|
self.track = self.source.audio
|
|
else:
|
|
self.track = self.source.video
|
|
|
|
def source_reload(self):
|
|
print(f'reload the source----{self.source._file_path}')
|
|
self.set_source(MyMediaPlayer(self.source._file_path))
|
|
|
|
def set_source(self, source):
|
|
self.source = source
|
|
self.set_source_track()
|
|
|
|
|
|
class LoopingVideoTrack(VideoStreamTrack):
|
|
"""
|
|
A video track that loops a video file.
|
|
"""
|
|
def __init__(self, filename):
|
|
super().__init__()
|
|
self.player = MediaPlayer(filename)
|
|
self.iteration = 0
|
|
|
|
async def recv(self):
|
|
frame = await self.player.video.recv()
|
|
print(f'{self.__class__.__name__}, {self.player.video.readyState}')
|
|
if self.player.video.readyState != 'live':
|
|
self.player = MediaPlayer(self.player._file_path)
|
|
frame = await self.player.video.recv()
|
|
return frame
|
|
|