|
|
@ -7,7 +7,9 @@ import time
|
|
|
|
from typing import Tuple, Dict, Optional, Set, Union
|
|
|
|
from typing import Tuple, Dict, Optional, Set, Union
|
|
|
|
from av.frame import Frame
|
|
|
|
from av.frame import Frame
|
|
|
|
from av.packet import Packet
|
|
|
|
from av.packet import Packet
|
|
|
|
|
|
|
|
from av import AudioFrame
|
|
|
|
import fractions
|
|
|
|
import fractions
|
|
|
|
|
|
|
|
import numpy as np
|
|
|
|
|
|
|
|
|
|
|
|
AUDIO_PTIME = 0.020 # 20ms audio packetization
|
|
|
|
AUDIO_PTIME = 0.020 # 20ms audio packetization
|
|
|
|
VIDEO_CLOCK_RATE = 90000
|
|
|
|
VIDEO_CLOCK_RATE = 90000
|
|
|
@ -52,9 +54,9 @@ class PlayerStreamTrack(MediaStreamTrack):
|
|
|
|
if hasattr(self, "_timestamp"):
|
|
|
|
if hasattr(self, "_timestamp"):
|
|
|
|
# self._timestamp = (time.time()-self._start) * VIDEO_CLOCK_RATE
|
|
|
|
# self._timestamp = (time.time()-self._start) * VIDEO_CLOCK_RATE
|
|
|
|
self._timestamp += int(VIDEO_PTIME * VIDEO_CLOCK_RATE)
|
|
|
|
self._timestamp += int(VIDEO_PTIME * VIDEO_CLOCK_RATE)
|
|
|
|
# wait = self._start + (self._timestamp / VIDEO_CLOCK_RATE) - time.time()
|
|
|
|
wait = self._start + (self._timestamp / VIDEO_CLOCK_RATE) - time.time()
|
|
|
|
# if wait>0:
|
|
|
|
if wait>0:
|
|
|
|
# await asyncio.sleep(wait)
|
|
|
|
await asyncio.sleep(wait)
|
|
|
|
else:
|
|
|
|
else:
|
|
|
|
self._start = time.time()
|
|
|
|
self._start = time.time()
|
|
|
|
self._timestamp = 0
|
|
|
|
self._timestamp = 0
|
|
|
@ -63,9 +65,9 @@ class PlayerStreamTrack(MediaStreamTrack):
|
|
|
|
if hasattr(self, "_timestamp"):
|
|
|
|
if hasattr(self, "_timestamp"):
|
|
|
|
# self._timestamp = (time.time()-self._start) * SAMPLE_RATE
|
|
|
|
# self._timestamp = (time.time()-self._start) * SAMPLE_RATE
|
|
|
|
self._timestamp += int(AUDIO_PTIME * SAMPLE_RATE)
|
|
|
|
self._timestamp += int(AUDIO_PTIME * SAMPLE_RATE)
|
|
|
|
# wait = self._start + (self._timestamp / SAMPLE_RATE) - time.time()
|
|
|
|
wait = self._start + (self._timestamp / SAMPLE_RATE) - time.time()
|
|
|
|
# if wait>0:
|
|
|
|
if wait>0:
|
|
|
|
# await asyncio.sleep(wait)
|
|
|
|
await asyncio.sleep(wait)
|
|
|
|
else:
|
|
|
|
else:
|
|
|
|
self._start = time.time()
|
|
|
|
self._start = time.time()
|
|
|
|
self._timestamp = 0
|
|
|
|
self._timestamp = 0
|
|
|
@ -74,6 +76,22 @@ class PlayerStreamTrack(MediaStreamTrack):
|
|
|
|
async def recv(self) -> Union[Frame, Packet]:
|
|
|
|
async def recv(self) -> Union[Frame, Packet]:
|
|
|
|
# frame = self.frames[self.counter % 30]
|
|
|
|
# frame = self.frames[self.counter % 30]
|
|
|
|
self._player._start(self)
|
|
|
|
self._player._start(self)
|
|
|
|
|
|
|
|
# if self.kind == 'video':
|
|
|
|
|
|
|
|
# frame = await self._queue.get()
|
|
|
|
|
|
|
|
# else: #audio
|
|
|
|
|
|
|
|
# if hasattr(self, "_timestamp"):
|
|
|
|
|
|
|
|
# wait = self._start + self._timestamp / SAMPLE_RATE + AUDIO_PTIME - time.time()
|
|
|
|
|
|
|
|
# if wait>0:
|
|
|
|
|
|
|
|
# await asyncio.sleep(wait)
|
|
|
|
|
|
|
|
# if self._queue.qsize()<1:
|
|
|
|
|
|
|
|
# #frame = AudioFrame(format='s16', layout='mono', samples=320)
|
|
|
|
|
|
|
|
# audio = np.zeros((1, 320), dtype=np.int16)
|
|
|
|
|
|
|
|
# frame = AudioFrame.from_ndarray(audio, layout='mono', format='s16')
|
|
|
|
|
|
|
|
# frame.sample_rate=16000
|
|
|
|
|
|
|
|
# else:
|
|
|
|
|
|
|
|
# frame = await self._queue.get()
|
|
|
|
|
|
|
|
# else:
|
|
|
|
|
|
|
|
# frame = await self._queue.get()
|
|
|
|
frame = await self._queue.get()
|
|
|
|
frame = await self._queue.get()
|
|
|
|
pts, time_base = await self.next_timestamp()
|
|
|
|
pts, time_base = await self.next_timestamp()
|
|
|
|
frame.pts = pts
|
|
|
|
frame.pts = pts
|
|
|
|