66
77import aiortc
88from aiortc .mediastreams import VIDEO_CLOCK_RATE , VIDEO_TIME_BASE
9- from aiortc .contrib .media import MediaPlayer
10- import av
11- import numpy as np
9+
10+
11+ def video_track_id (camera_type : str , track_id : str ) -> str :
12+ return f"{ camera_type } :{ track_id } "
1213
1314
1415class TiciVideoStreamTrack (aiortc .MediaStreamTrack ):
16+ """
17+ Abstract video track which associates video track with camera_type
18+ """
1519 kind = "video"
1620
1721 def __init__ (self , camera_type : str , dt : float , time_base : fractions .Fraction = VIDEO_TIME_BASE , clock_rate : int = VIDEO_CLOCK_RATE ):
1822 assert camera_type in ["driver" , "wideRoad" , "road" ]
1923 super ().__init__ ()
2024 # override track id to include camera type - client needs that for identification
21- self ._id : str = f" { camera_type } : { self ._id } "
25+ self ._id : str = video_track_id ( camera_type , self ._id )
2226 self ._dt : float = dt
2327 self ._time_base : fractions .Fraction = time_base
2428 self ._clock_rate : int = clock_rate
@@ -44,20 +48,20 @@ def codec_preference(self) -> Optional[str]:
4448 return None
4549
4650
47- class DummyVideoStreamTrack (TiciVideoStreamTrack ):
48- def __init__ (self , camera_type : str , dt : float = 1 / 20 , color : int = 0 ):
49- super ().__init__ (camera_type , dt )
50- self ._color = color
51- self ._pts = 0
52-
53- async def recv (self ):
54- self .log_debug ("track sending frame %s" , self ._pts )
55- img = np .full ((1920 , 1080 , 3 ), self ._color , dtype = np .uint8 )
56-
57- new_frame = av .VideoFrame .from_ndarray (img , format = "rgb24" )
58- new_frame .pts = self ._pts
59- new_frame .time_base = self ._time_base
51+ class TiciTrackWrapper (aiortc .MediaStreamTrack ):
52+ """
53+ Associates video track with camera_type
54+ """
55+ def __init__ (self , camera_type : str , track : aiortc .MediaStreamTrack ):
56+ assert track .kind == "video"
57+ assert not isinstance (track , TiciVideoStreamTrack )
58+ super ().__init__ ()
59+ self ._id = video_track_id (camera_type , track .id )
60+ self ._track = track
6061
61- self ._pts = await self .next_pts (self ._pts )
62+ @property
63+ def kind (self ) -> str :
64+ return self ._track .kind
6265
63- return new_frame
66+ async def recv (self ):
67+ return await self ._track .recv ()
0 commit comments