rtcllm/rtcllm/aav.py
2024-09-11 14:13:52 +08:00

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 = MyMediaPlayer(filename)
print(dir(self.player))
async def recv(self):
frame = await self.player.video.recv()
print(f'{self.__class__.__name__}, {self.source.duration=}, {self.source.time=}')
if self.player.video.readyState != 'live':
self.player = MyMediaPlayer(self.player._file_path)
frame = await self.player.video.recv()
return frame