agora-python-server-sdk 1.1.2__tar.gz → 2.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of agora-python-server-sdk might be problematic. Click here for more details.
- agora_python_server_sdk-2.0.0/MANIFEST.in +1 -0
- agora_python_server_sdk-2.0.0/PKG-INFO +76 -0
- agora_python_server_sdk-2.0.0/README.md +59 -0
- {agora_python_server_sdk-1.1.2/agora_service → agora_python_server_sdk-2.0.0/agora/rtc}/__init__.py +4 -7
- agora_python_server_sdk-2.0.0/agora/rtc/_audio_frame_observer.py +155 -0
- agora_python_server_sdk-2.0.0/agora/rtc/_local_user_observer.py +494 -0
- agora_python_server_sdk-2.0.0/agora/rtc/_rtc_connection_observer.py +335 -0
- agora_python_server_sdk-2.0.0/agora/rtc/_video_encoded_frame_observer.py +60 -0
- agora_python_server_sdk-2.0.0/agora/rtc/_video_frame_observer.py +91 -0
- agora_python_server_sdk-2.0.0/agora/rtc/agora_base.py +350 -0
- agora_python_server_sdk-2.0.0/agora/rtc/agora_parameter.py +179 -0
- agora_python_server_sdk-2.0.0/agora/rtc/agora_service.py +244 -0
- agora_python_server_sdk-2.0.0/agora/rtc/audio_encoded_frame_sender.py +91 -0
- agora_python_server_sdk-2.0.0/agora/rtc/audio_frame_observer.py +50 -0
- agora_python_server_sdk-2.0.0/agora/rtc/audio_pcm_data_sender.py +34 -0
- {agora_python_server_sdk-1.1.2/agora_service → agora_python_server_sdk-2.0.0/agora/rtc}/audio_vad.py +12 -6
- agora_python_server_sdk-2.0.0/agora/rtc/globals.py +63 -0
- agora_python_server_sdk-2.0.0/agora/rtc/local_audio_track.py +118 -0
- agora_python_server_sdk-2.0.0/agora/rtc/local_user.py +605 -0
- agora_python_server_sdk-2.0.0/agora/rtc/local_user_observer.py +117 -0
- agora_python_server_sdk-2.0.0/agora/rtc/local_video_track.py +81 -0
- agora_python_server_sdk-2.0.0/agora/rtc/media_node_factory.py +65 -0
- agora_python_server_sdk-2.0.0/agora/rtc/remote_audio_track.py +50 -0
- agora_python_server_sdk-2.0.0/agora/rtc/remote_video_track.py +138 -0
- agora_python_server_sdk-2.0.0/agora/rtc/rtc_connection.py +349 -0
- agora_python_server_sdk-2.0.0/agora/rtc/rtc_connection_observer.py +99 -0
- agora_python_server_sdk-2.0.0/agora/rtc/video_encoded_frame_observer.py +21 -0
- agora_python_server_sdk-2.0.0/agora/rtc/video_frame_observer.py +44 -0
- agora_python_server_sdk-2.0.0/agora/rtc/video_frame_sender.py +198 -0
- agora_python_server_sdk-2.0.0/agora_python_server_sdk.egg-info/PKG-INFO +76 -0
- agora_python_server_sdk-2.0.0/agora_python_server_sdk.egg-info/SOURCES.txt +34 -0
- agora_python_server_sdk-2.0.0/agora_python_server_sdk.egg-info/top_level.txt +1 -0
- {agora_python_server_sdk-1.1.2 → agora_python_server_sdk-2.0.0}/setup.py +8 -7
- agora_python_server_sdk-1.1.2/MANIFEST.in +0 -1
- agora_python_server_sdk-1.1.2/PKG-INFO +0 -54
- agora_python_server_sdk-1.1.2/README.md +0 -37
- agora_python_server_sdk-1.1.2/agora_python_server_sdk.egg-info/PKG-INFO +0 -54
- agora_python_server_sdk-1.1.2/agora_python_server_sdk.egg-info/SOURCES.txt +0 -21
- agora_python_server_sdk-1.1.2/agora_python_server_sdk.egg-info/top_level.txt +0 -1
- agora_python_server_sdk-1.1.2/agora_service/agora_base.py +0 -71
- agora_python_server_sdk-1.1.2/agora_service/agora_service.py +0 -110
- agora_python_server_sdk-1.1.2/agora_service/audio_frame_observer.py +0 -65
- agora_python_server_sdk-1.1.2/agora_service/audio_pcm_data_sender.py +0 -86
- agora_python_server_sdk-1.1.2/agora_service/local_audio_track.py +0 -30
- agora_python_server_sdk-1.1.2/agora_service/local_user.py +0 -15
- agora_python_server_sdk-1.1.2/agora_service/media_node_factory.py +0 -16
- agora_python_server_sdk-1.1.2/agora_service/rtc_conn_observer.py +0 -299
- agora_python_server_sdk-1.1.2/agora_service/rtc_connection.py +0 -321
- agora_python_server_sdk-1.1.2/agora_service/video_frame_observer.py +0 -34
- agora_python_server_sdk-1.1.2/agora_service/video_sender.py +0 -193
- {agora_python_server_sdk-1.1.2 → agora_python_server_sdk-2.0.0}/agora_python_server_sdk.egg-info/dependency_links.txt +0 -0
- {agora_python_server_sdk-1.1.2 → agora_python_server_sdk-2.0.0}/pyproject.toml +0 -0
- {agora_python_server_sdk-1.1.2 → agora_python_server_sdk-2.0.0}/setup.cfg +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
exclude agora_rtc/agora/rtc/agora_sdk/*
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: agora_python_server_sdk
|
|
3
|
+
Version: 2.0.0
|
|
4
|
+
Summary: A Python SDK for Agora Server
|
|
5
|
+
Home-page: https://github.com/AgoraIO-Extensions/Agora-Python-Server-SDK
|
|
6
|
+
Classifier: Intended Audience :: Developers
|
|
7
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
8
|
+
Classifier: Topic :: Multimedia :: Sound/Audio
|
|
9
|
+
Classifier: Topic :: Multimedia :: Video
|
|
10
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
11
|
+
Classifier: Programming Language :: Python :: 3
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.8
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
14
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
15
|
+
Requires-Python: >=3.8
|
|
16
|
+
Description-Content-Type: text/markdown
|
|
17
|
+
|
|
18
|
+
# Notice
|
|
19
|
+
- this is a python sdk wrappered agora rtc sdk.
|
|
20
|
+
- can dev under mac, and release unde linux
|
|
21
|
+
- the examples is just a simple demo, it is not a good practice to use it in production
|
|
22
|
+
# Very import notice !!!!!!!
|
|
23
|
+
- It's crucial that a process can only have one instance.
|
|
24
|
+
- One instance can have multiple connections.
|
|
25
|
+
- In all observers or callbacks, it is not allowed to call the SDK's own APIs, nor is it permitted to perform CPU-intensive tasks within the callbacks. However, data copying is allowed.
|
|
26
|
+
|
|
27
|
+
# Required OS and python version
|
|
28
|
+
- supported Linux version:
|
|
29
|
+
- Ubuntu 18.04 LTS and above
|
|
30
|
+
- CentOS 7.0 and above
|
|
31
|
+
|
|
32
|
+
- supported Mac version:
|
|
33
|
+
|
|
34
|
+
- MacOS 13 and above
|
|
35
|
+
|
|
36
|
+
- python version:
|
|
37
|
+
- python 3.8 above
|
|
38
|
+
|
|
39
|
+
# Test Data
|
|
40
|
+
- download and unzip [test_data.zip](https://download.agora.io/demo/test/test_data_202408221437.zip)
|
|
41
|
+
- make **test_data** directory in the same directory with **agora_rtc**
|
|
42
|
+
|
|
43
|
+
# Linux debug & develop
|
|
44
|
+
## Prepare C version of agora rtc sdk
|
|
45
|
+
|
|
46
|
+
- make **agora_sdk** directory under the directory of **agora_rtc/agora/rtc**
|
|
47
|
+
- download and unzip [agora_sdk.zip](https://download.agora.io/sdk/release/agora_rtc_sdk_linux_v4.4_20240914_1538_336910.zip) to **agora_sdk**
|
|
48
|
+
- there should be **libagora_rtc_sdk.so** and **include_c** in **agora_sdk** directory
|
|
49
|
+
|
|
50
|
+
## run example on linux
|
|
51
|
+
```
|
|
52
|
+
python agora_rtc/examples/example_audio_pcm_send.py --appId=xxx --channelId=xxx --userId=xxx --audioFile=./test_data/demo.pcm --sampleRate=16000 --numOfChannels=1
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
# Mac debug & develop
|
|
56
|
+
## Prepare C version of agora rtc sdk
|
|
57
|
+
- make **agora_sdk** directory under the directory of **agora_rtc/agora/rtc**
|
|
58
|
+
- download and unzip [agora_sdk.zip](https://download.agora.io/sdk/release/agora_rtc_sdk_mac_v4.4_20240914_1538_336910.zip) to **agora_sdk**
|
|
59
|
+
- there should be **libAgoraRtcKit.dylib** in **agora_sdk** directory
|
|
60
|
+
|
|
61
|
+
## run example on mac
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
python agora_rtc/examples/example_audio_pcm_send.py --appId=xxx --channelId=xxx --userId=xxx --audioFile=./test_data/demo.pcm --sampleRate=16000 --numOfChannels=1
|
|
65
|
+
```
|
|
66
|
+
# Some import call sequence
|
|
67
|
+
- 1. about audio frame observer:
|
|
68
|
+
|
|
69
|
+
set_playback_audio_frame_before_mixing_parameters MUST be call before register_audio_frame_observer
|
|
70
|
+
|
|
71
|
+
sample code:
|
|
72
|
+
```
|
|
73
|
+
localuser.set_playback_audio_frame_before_mixing_parameters(1, 16000)
|
|
74
|
+
audio_observer = BizAudioFrameObserver()
|
|
75
|
+
localuser.register_audio_frame_observer(audio_observer)
|
|
76
|
+
```
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Notice
|
|
2
|
+
- this is a python sdk wrappered agora rtc sdk.
|
|
3
|
+
- can dev under mac, and release unde linux
|
|
4
|
+
- the examples is just a simple demo, it is not a good practice to use it in production
|
|
5
|
+
# Very import notice !!!!!!!
|
|
6
|
+
- It's crucial that a process can only have one instance.
|
|
7
|
+
- One instance can have multiple connections.
|
|
8
|
+
- In all observers or callbacks, it is not allowed to call the SDK's own APIs, nor is it permitted to perform CPU-intensive tasks within the callbacks. However, data copying is allowed.
|
|
9
|
+
|
|
10
|
+
# Required OS and python version
|
|
11
|
+
- supported Linux version:
|
|
12
|
+
- Ubuntu 18.04 LTS and above
|
|
13
|
+
- CentOS 7.0 and above
|
|
14
|
+
|
|
15
|
+
- supported Mac version:
|
|
16
|
+
|
|
17
|
+
- MacOS 13 and above
|
|
18
|
+
|
|
19
|
+
- python version:
|
|
20
|
+
- python 3.8 above
|
|
21
|
+
|
|
22
|
+
# Test Data
|
|
23
|
+
- download and unzip [test_data.zip](https://download.agora.io/demo/test/test_data_202408221437.zip)
|
|
24
|
+
- make **test_data** directory in the same directory with **agora_rtc**
|
|
25
|
+
|
|
26
|
+
# Linux debug & develop
|
|
27
|
+
## Prepare C version of agora rtc sdk
|
|
28
|
+
|
|
29
|
+
- make **agora_sdk** directory under the directory of **agora_rtc/agora/rtc**
|
|
30
|
+
- download and unzip [agora_sdk.zip](https://download.agora.io/sdk/release/agora_rtc_sdk_linux_v4.4_20240914_1538_336910.zip) to **agora_sdk**
|
|
31
|
+
- there should be **libagora_rtc_sdk.so** and **include_c** in **agora_sdk** directory
|
|
32
|
+
|
|
33
|
+
## run example on linux
|
|
34
|
+
```
|
|
35
|
+
python agora_rtc/examples/example_audio_pcm_send.py --appId=xxx --channelId=xxx --userId=xxx --audioFile=./test_data/demo.pcm --sampleRate=16000 --numOfChannels=1
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
# Mac debug & develop
|
|
39
|
+
## Prepare C version of agora rtc sdk
|
|
40
|
+
- make **agora_sdk** directory under the directory of **agora_rtc/agora/rtc**
|
|
41
|
+
- download and unzip [agora_sdk.zip](https://download.agora.io/sdk/release/agora_rtc_sdk_mac_v4.4_20240914_1538_336910.zip) to **agora_sdk**
|
|
42
|
+
- there should be **libAgoraRtcKit.dylib** in **agora_sdk** directory
|
|
43
|
+
|
|
44
|
+
## run example on mac
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
python agora_rtc/examples/example_audio_pcm_send.py --appId=xxx --channelId=xxx --userId=xxx --audioFile=./test_data/demo.pcm --sampleRate=16000 --numOfChannels=1
|
|
48
|
+
```
|
|
49
|
+
# Some import call sequence
|
|
50
|
+
- 1. about audio frame observer:
|
|
51
|
+
|
|
52
|
+
set_playback_audio_frame_before_mixing_parameters MUST be call before register_audio_frame_observer
|
|
53
|
+
|
|
54
|
+
sample code:
|
|
55
|
+
```
|
|
56
|
+
localuser.set_playback_audio_frame_before_mixing_parameters(1, 16000)
|
|
57
|
+
audio_observer = BizAudioFrameObserver()
|
|
58
|
+
localuser.register_audio_frame_observer(audio_observer)
|
|
59
|
+
```
|
{agora_python_server_sdk-1.1.2/agora_service → agora_python_server_sdk-2.0.0/agora/rtc}/__init__.py
RENAMED
|
@@ -7,19 +7,16 @@ import ctypes
|
|
|
7
7
|
sdk_dir = os.path.dirname(os.path.abspath(__file__))
|
|
8
8
|
lib_path = os.path.join(sdk_dir, 'agora_sdk')
|
|
9
9
|
|
|
10
|
-
print("sdk_dir:", lib_path)
|
|
11
|
-
|
|
12
10
|
try:
|
|
13
11
|
if sys.platform == 'darwin':
|
|
14
12
|
lib_agora_rtc_path =os.path.join(lib_path, 'libAgoraRtcKit.dylib')
|
|
15
13
|
agora_lib = ctypes.CDLL(lib_agora_rtc_path)
|
|
16
|
-
|
|
14
|
+
|
|
15
|
+
elif sys.platform == 'linux':
|
|
17
16
|
lib_agora_rtc_path =os.path.join(lib_path, 'libagora_rtc_sdk.so')
|
|
18
17
|
ctypes.CDLL(os.path.join(lib_path, 'libagora-fdkaac.so'))
|
|
19
|
-
ctypes.CDLL(os.path.join(lib_path, '
|
|
20
|
-
ctypes.CDLL(
|
|
21
|
-
ctypes.CDLL(os.path.join(lib_path, 'libagora_uap_aed.so'))
|
|
22
|
-
agora_lib = ctypes.CDLL(lib_agora_rtc_path)
|
|
18
|
+
ctypes.CDLL(os.path.join(lib_path, 'libaosl.so'))
|
|
19
|
+
agora_lib = ctypes.CDLL(lib_agora_rtc_path)
|
|
23
20
|
except OSError as e:
|
|
24
21
|
print(f"Error loading the library: {e}")
|
|
25
22
|
print(f"Attempted to load from: {lib_agora_rtc_path}")
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import ctypes
|
|
2
|
+
from .agora_base import *
|
|
3
|
+
from .local_user import *
|
|
4
|
+
import ctypes
|
|
5
|
+
from .audio_frame_observer import *
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class AudioFrameInner(ctypes.Structure):
|
|
9
|
+
_fields_ = [
|
|
10
|
+
("type", ctypes.c_int),
|
|
11
|
+
("samples_per_channel", ctypes.c_int),
|
|
12
|
+
("bytes_per_sample", ctypes.c_int),
|
|
13
|
+
("channels", ctypes.c_int),
|
|
14
|
+
("samples_per_sec", ctypes.c_int),
|
|
15
|
+
("buffer", ctypes.c_void_p),
|
|
16
|
+
("render_time_ms", ctypes.c_int64),
|
|
17
|
+
("avsync_type", ctypes.c_int)
|
|
18
|
+
]
|
|
19
|
+
def _to_audio_frame(self):
|
|
20
|
+
audio_frame = AudioFrame()
|
|
21
|
+
audio_frame.type = self.type
|
|
22
|
+
audio_frame.samples_per_channel = self.samples_per_channel
|
|
23
|
+
audio_frame.bytes_per_sample = self.bytes_per_sample
|
|
24
|
+
audio_frame.channels = self.channels
|
|
25
|
+
audio_frame.samples_per_sec = self.samples_per_sec
|
|
26
|
+
cdata = ctypes.string_at(self.buffer, self.samples_per_channel * self.bytes_per_sample * self.channels)
|
|
27
|
+
audio_frame.buffer = bytearray(cdata)
|
|
28
|
+
audio_frame.render_time_ms = self.render_time_ms
|
|
29
|
+
audio_frame.avsync_type = self.avsync_type
|
|
30
|
+
return audio_frame
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
ON_RECORD_AUDIO_FRAME_CALLBACK = ctypes.CFUNCTYPE(ctypes.c_int, AGORA_HANDLE, ctypes.c_char_p, ctypes.POINTER(AudioFrameInner))
|
|
34
|
+
ON_PLAYBACK_AUDIO_FRAME_CALLBACK = ctypes.CFUNCTYPE(ctypes.c_int, AGORA_HANDLE, ctypes.c_char_p, ctypes.POINTER(AudioFrameInner))
|
|
35
|
+
ON_MIXED_AUDIO_FRAME_CALLBACK = ctypes.CFUNCTYPE(ctypes.c_int, AGORA_HANDLE, ctypes.c_char_p, ctypes.POINTER(AudioFrameInner))
|
|
36
|
+
ON_EAR_MONITORING_AUDIO_FRAME_CALLBACK = ctypes.CFUNCTYPE(ctypes.c_int, AGORA_HANDLE, ctypes.POINTER(AudioFrameInner))
|
|
37
|
+
ON_PLAYBACK_AUDIO_FRAME_BEFORE_MIXING_CALLBACK = ctypes.CFUNCTYPE(ctypes.c_int, AGORA_HANDLE, ctypes.c_char_p, user_id_t, ctypes.POINTER(AudioFrameInner))
|
|
38
|
+
ON_GET_AUDIO_FRAME_POSITION_CALLBACK = ctypes.CFUNCTYPE(ctypes.c_int, AGORA_HANDLE)
|
|
39
|
+
ON_GET_PLAYBACK_AUDIO_FRAME_PARAM_CALLBACK = ctypes.CFUNCTYPE(AudioParams, AGORA_HANDLE)
|
|
40
|
+
ON_GET_RECORD_AUDIO_FRAME_PARAM_CALLBACK = ctypes.CFUNCTYPE(AudioParams, AGORA_HANDLE)
|
|
41
|
+
ON_GET_MIXED_AUDIO_FRAME_PARAM_CALLBACK = ctypes.CFUNCTYPE(AudioParams, AGORA_HANDLE)
|
|
42
|
+
ON_GET_EAR_MONITORING_AUDIO_FRAME_PARAM_CALLBACK = ctypes.CFUNCTYPE(AudioParams, AGORA_HANDLE)
|
|
43
|
+
|
|
44
|
+
class AudioFrameObserverInner(ctypes.Structure):
|
|
45
|
+
_fields_ = [
|
|
46
|
+
("on_record_audio_frame", ON_RECORD_AUDIO_FRAME_CALLBACK),
|
|
47
|
+
("on_playback_audio_frame", ON_PLAYBACK_AUDIO_FRAME_CALLBACK),
|
|
48
|
+
("on_mixed_audio_frame", ON_MIXED_AUDIO_FRAME_CALLBACK),
|
|
49
|
+
("on_ear_monitoring_audio_frame", ON_EAR_MONITORING_AUDIO_FRAME_CALLBACK),
|
|
50
|
+
|
|
51
|
+
("on_playback_audio_frame_before_mixing", ON_PLAYBACK_AUDIO_FRAME_BEFORE_MIXING_CALLBACK),
|
|
52
|
+
("on_get_audio_frame_position", ON_GET_AUDIO_FRAME_POSITION_CALLBACK),
|
|
53
|
+
("on_get_playback_audio_frame_param", ON_GET_PLAYBACK_AUDIO_FRAME_PARAM_CALLBACK),
|
|
54
|
+
("on_get_record_audio_frame_param", ON_GET_RECORD_AUDIO_FRAME_PARAM_CALLBACK),
|
|
55
|
+
|
|
56
|
+
("on_get_mixed_audio_frame_param", ON_GET_MIXED_AUDIO_FRAME_PARAM_CALLBACK),
|
|
57
|
+
("on_get_ear_monitoring_audio_frame_param", ON_GET_EAR_MONITORING_AUDIO_FRAME_PARAM_CALLBACK)
|
|
58
|
+
]
|
|
59
|
+
|
|
60
|
+
def __init__(self, observer:IAudioFrameObserver, local_user: 'LocalUser'):
|
|
61
|
+
self.observer = observer
|
|
62
|
+
self.local_user = local_user
|
|
63
|
+
self.on_record_audio_frame = ON_RECORD_AUDIO_FRAME_CALLBACK(self._on_record_audio_frame)
|
|
64
|
+
self.on_playback_audio_frame = ON_PLAYBACK_AUDIO_FRAME_CALLBACK(self._on_playback_audio_frame)
|
|
65
|
+
self.on_mixed_audio_frame = ON_MIXED_AUDIO_FRAME_CALLBACK(self._on_mixed_audio_frame)
|
|
66
|
+
self.on_ear_monitoring_audio_frame = ON_EAR_MONITORING_AUDIO_FRAME_CALLBACK(self._on_ear_monitoring_audio_frame)
|
|
67
|
+
self.on_playback_audio_frame_before_mixing = ON_PLAYBACK_AUDIO_FRAME_BEFORE_MIXING_CALLBACK(self._on_playback_audio_frame_before_mixing)
|
|
68
|
+
self.on_get_audio_frame_position = ON_GET_AUDIO_FRAME_POSITION_CALLBACK(self._on_get_audio_frame_position)
|
|
69
|
+
|
|
70
|
+
# self.on_get_playback_audio_frame_param = ON_GET_PLAYBACK_AUDIO_FRAME_PARAM_CALLBACK(self._on_get_playback_audio_frame_param)
|
|
71
|
+
# self.on_get_record_audio_frame_param = ON_GET_RECORD_AUDIO_FRAME_PARAM_CALLBACK(self._on_get_record_audio_frame_param)
|
|
72
|
+
# self.on_get_mixed_audio_frame_param = ON_GET_MIXED_AUDIO_FRAME_PARAM_CALLBACK(self._on_get_mixed_audio_frame_param)
|
|
73
|
+
# self.on_get_ear_monitoring_audio_frame_param = ON_GET_EAR_MONITORING_AUDIO_FRAME_PARAM_CALLBACK(self._on_get_ear_monitoring_audio_frame_param)
|
|
74
|
+
|
|
75
|
+
def _on_record_audio_frame(self, local_user_handle, channel_id, audio_frame_inner):
|
|
76
|
+
print("AudioFrameObserverInner _on_record_audio_frame", local_user_handle, channel_id, audio_frame_inner)
|
|
77
|
+
channel_id_str = channel_id.decode('utf-8')
|
|
78
|
+
frame = audio_frame_inner.contents._to_audio_frame()
|
|
79
|
+
ret = self.observer.on_record_audio_frame(self.local_user, channel_id_str, frame)
|
|
80
|
+
return ret
|
|
81
|
+
|
|
82
|
+
def _on_playback_audio_frame(self, local_user_handle, channel_id, audio_frame_inner):
|
|
83
|
+
print("AudioFrameObserverInner _on_playback_audio_frame", local_user_handle, channel_id, audio_frame_inner)
|
|
84
|
+
channel_id_str = channel_id.decode('utf-8')
|
|
85
|
+
frame = audio_frame_inner.contents._to_audio_frame()
|
|
86
|
+
ret = self.observer.on_playback_audio_frame(self.local_user, channel_id_str, frame)
|
|
87
|
+
return ret
|
|
88
|
+
|
|
89
|
+
def _on_mixed_audio_frame(self, local_user_handle, channel_id, audio_frame_inner):
|
|
90
|
+
print("AudioFrameObserverInner _on_mixed_audio_frame", local_user_handle, channel_id, audio_frame_inner)
|
|
91
|
+
ret = self.observer.on_mixed_audio_frame(self.local_user, audio_frame_inner)
|
|
92
|
+
return ret
|
|
93
|
+
|
|
94
|
+
def _on_ear_monitoring_audio_frame(self, local_user_handle, audio_frame_inner):
|
|
95
|
+
print("AudioFrameObserverInner _on_ear_monitoring_audio_frame", local_user_handle, audio_frame_inner)
|
|
96
|
+
ret = self.observer.on_ear_monitoring_audio_frame(self.local_user, audio_frame_inner)
|
|
97
|
+
return ret
|
|
98
|
+
|
|
99
|
+
def _on_playback_audio_frame_before_mixing(self, local_user_handle, channel_id, user_id, audio_frame_inner):
|
|
100
|
+
print("AudioFrameObserverInner _on_playback_audio_frame_before_mixing", local_user_handle, channel_id, user_id, audio_frame_inner)
|
|
101
|
+
if channel_id is None:
|
|
102
|
+
channel_id_str = ""
|
|
103
|
+
else:
|
|
104
|
+
channel_id_str = channel_id.decode('utf-8')
|
|
105
|
+
|
|
106
|
+
user_id_str = user_id.decode('utf-8')
|
|
107
|
+
frame = audio_frame_inner.contents._to_audio_frame()
|
|
108
|
+
ret = self.observer.on_playback_audio_frame_before_mixing(self.local_user, channel_id_str, user_id_str, frame)
|
|
109
|
+
return ret
|
|
110
|
+
|
|
111
|
+
def _on_get_audio_frame_position(self, local_user_handle):
|
|
112
|
+
print("AudioFrameObserverInner _on_get_audio_frame_position", local_user_handle)
|
|
113
|
+
return 0
|
|
114
|
+
return self.observer.on_get_audio_frame_position(self.local_user)
|
|
115
|
+
|
|
116
|
+
def _on_get_playback_audio_frame_param(self, local_user_handle):
|
|
117
|
+
print("AudioFrameObserverInner _on_get_playback_audio_frame_param", local_user_handle)
|
|
118
|
+
params = AudioParams()
|
|
119
|
+
params.sample_rate = 16000 # 示例值
|
|
120
|
+
params.channels = 1 # 示例值
|
|
121
|
+
params.mode = 0 # 示例值
|
|
122
|
+
params.samples_per_call = 1024 # 示例值
|
|
123
|
+
return params
|
|
124
|
+
return self.observer.on_get_playback_audio_frame_param(self.local_user)
|
|
125
|
+
|
|
126
|
+
def _on_get_record_audio_frame_param(self, local_user_handle):
|
|
127
|
+
print("AudioFrameObserverInner _on_get_record_audio_frame_param", local_user_handle)
|
|
128
|
+
params = AudioParams()
|
|
129
|
+
params.sample_rate = 16000 # 示例值
|
|
130
|
+
params.channels = 1 # 示例值
|
|
131
|
+
params.mode = 0 # 示例值
|
|
132
|
+
params.samples_per_call = 1024 # 示例值
|
|
133
|
+
return params
|
|
134
|
+
return self.observer.on_get_record_audio_frame_param(self.local_user)
|
|
135
|
+
|
|
136
|
+
def _on_get_mixed_audio_frame_param(self, local_user_handle):
|
|
137
|
+
print("AudioFrameObserverInner _on_get_mixed_audio_frame_param", local_user_handle)
|
|
138
|
+
params = AudioParams()
|
|
139
|
+
params.sample_rate = 16000 # 示例值
|
|
140
|
+
params.channels = 1 # 示例值
|
|
141
|
+
params.mode = 0 # 示例值
|
|
142
|
+
params.samples_per_call = 1024 # 示例值
|
|
143
|
+
return params
|
|
144
|
+
return self.observer.on_get_mixed_audio_frame_param(self.local_user)
|
|
145
|
+
|
|
146
|
+
def _on_get_ear_monitoring_audio_frame_param(self, local_user_handle):
|
|
147
|
+
print("AudioFrameObserverInner _on_get_ear_monitoring_audio_frame_param", local_user_handle)
|
|
148
|
+
params = AudioParams()
|
|
149
|
+
params.sample_rate = 16000 # 示例值
|
|
150
|
+
params.channels = 1 # 示例值
|
|
151
|
+
params.mode = 0 # 示例值
|
|
152
|
+
params.samples_per_call = 1024 # 示例值
|
|
153
|
+
return params
|
|
154
|
+
return self.observer.on_get_ear_monitoring_audio_frame_param(self.local_user)
|
|
155
|
+
|