agora-python-server-sdk 2.2.0__tar.gz → 2.2.1__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.
Files changed (42) hide show
  1. {agora_python_server_sdk-2.2.0/agora_python_server_sdk.egg-info → agora_python_server_sdk-2.2.1}/PKG-INFO +15 -2
  2. {agora_python_server_sdk-2.2.0 → agora_python_server_sdk-2.2.1}/README.md +7 -0
  3. {agora_python_server_sdk-2.2.0 → agora_python_server_sdk-2.2.1}/agora/rtc/_ctypes_handle/_ctypes_data.py +3 -2
  4. {agora_python_server_sdk-2.2.0 → agora_python_server_sdk-2.2.1}/agora/rtc/utils/audio_consumer.py +30 -4
  5. {agora_python_server_sdk-2.2.0 → agora_python_server_sdk-2.2.1/agora_python_server_sdk.egg-info}/PKG-INFO +15 -2
  6. {agora_python_server_sdk-2.2.0 → agora_python_server_sdk-2.2.1}/setup.py +1 -1
  7. {agora_python_server_sdk-2.2.0 → agora_python_server_sdk-2.2.1}/MANIFEST.in +0 -0
  8. {agora_python_server_sdk-2.2.0 → agora_python_server_sdk-2.2.1}/agora/rtc/__init__.py +0 -0
  9. {agora_python_server_sdk-2.2.0 → agora_python_server_sdk-2.2.1}/agora/rtc/_ctypes_handle/_audio_frame_observer.py +0 -0
  10. {agora_python_server_sdk-2.2.0 → agora_python_server_sdk-2.2.1}/agora/rtc/_ctypes_handle/_local_user_observer.py +0 -0
  11. {agora_python_server_sdk-2.2.0 → agora_python_server_sdk-2.2.1}/agora/rtc/_ctypes_handle/_rtc_connection_observer.py +0 -0
  12. {agora_python_server_sdk-2.2.0 → agora_python_server_sdk-2.2.1}/agora/rtc/_ctypes_handle/_video_encoded_frame_observer.py +0 -0
  13. {agora_python_server_sdk-2.2.0 → agora_python_server_sdk-2.2.1}/agora/rtc/_ctypes_handle/_video_frame_observer.py +0 -0
  14. {agora_python_server_sdk-2.2.0 → agora_python_server_sdk-2.2.1}/agora/rtc/_utils/globals.py +0 -0
  15. {agora_python_server_sdk-2.2.0 → agora_python_server_sdk-2.2.1}/agora/rtc/agora_base.py +0 -0
  16. {agora_python_server_sdk-2.2.0 → agora_python_server_sdk-2.2.1}/agora/rtc/agora_parameter.py +0 -0
  17. {agora_python_server_sdk-2.2.0 → agora_python_server_sdk-2.2.1}/agora/rtc/agora_service.py +0 -0
  18. {agora_python_server_sdk-2.2.0 → agora_python_server_sdk-2.2.1}/agora/rtc/audio_encoded_frame_sender.py +0 -0
  19. {agora_python_server_sdk-2.2.0 → agora_python_server_sdk-2.2.1}/agora/rtc/audio_frame_observer.py +0 -0
  20. {agora_python_server_sdk-2.2.0 → agora_python_server_sdk-2.2.1}/agora/rtc/audio_pcm_data_sender.py +0 -0
  21. {agora_python_server_sdk-2.2.0 → agora_python_server_sdk-2.2.1}/agora/rtc/audio_sessionctrl.py +0 -0
  22. {agora_python_server_sdk-2.2.0 → agora_python_server_sdk-2.2.1}/agora/rtc/audio_vad_manager.py +0 -0
  23. {agora_python_server_sdk-2.2.0 → agora_python_server_sdk-2.2.1}/agora/rtc/local_audio_track.py +0 -0
  24. {agora_python_server_sdk-2.2.0 → agora_python_server_sdk-2.2.1}/agora/rtc/local_user.py +0 -0
  25. {agora_python_server_sdk-2.2.0 → agora_python_server_sdk-2.2.1}/agora/rtc/local_user_observer.py +0 -0
  26. {agora_python_server_sdk-2.2.0 → agora_python_server_sdk-2.2.1}/agora/rtc/local_video_track.py +0 -0
  27. {agora_python_server_sdk-2.2.0 → agora_python_server_sdk-2.2.1}/agora/rtc/media_node_factory.py +0 -0
  28. {agora_python_server_sdk-2.2.0 → agora_python_server_sdk-2.2.1}/agora/rtc/remote_audio_track.py +0 -0
  29. {agora_python_server_sdk-2.2.0 → agora_python_server_sdk-2.2.1}/agora/rtc/remote_video_track.py +0 -0
  30. {agora_python_server_sdk-2.2.0 → agora_python_server_sdk-2.2.1}/agora/rtc/rtc_connection.py +0 -0
  31. {agora_python_server_sdk-2.2.0 → agora_python_server_sdk-2.2.1}/agora/rtc/rtc_connection_observer.py +0 -0
  32. {agora_python_server_sdk-2.2.0 → agora_python_server_sdk-2.2.1}/agora/rtc/utils/vad_dump.py +0 -0
  33. {agora_python_server_sdk-2.2.0 → agora_python_server_sdk-2.2.1}/agora/rtc/video_encoded_frame_observer.py +0 -0
  34. {agora_python_server_sdk-2.2.0 → agora_python_server_sdk-2.2.1}/agora/rtc/video_encoded_image_sender.py +0 -0
  35. {agora_python_server_sdk-2.2.0 → agora_python_server_sdk-2.2.1}/agora/rtc/video_frame_observer.py +0 -0
  36. {agora_python_server_sdk-2.2.0 → agora_python_server_sdk-2.2.1}/agora/rtc/video_frame_sender.py +0 -0
  37. {agora_python_server_sdk-2.2.0 → agora_python_server_sdk-2.2.1}/agora/rtc/voice_detection.py +0 -0
  38. {agora_python_server_sdk-2.2.0 → agora_python_server_sdk-2.2.1}/agora_python_server_sdk.egg-info/SOURCES.txt +0 -0
  39. {agora_python_server_sdk-2.2.0 → agora_python_server_sdk-2.2.1}/agora_python_server_sdk.egg-info/dependency_links.txt +0 -0
  40. {agora_python_server_sdk-2.2.0 → agora_python_server_sdk-2.2.1}/agora_python_server_sdk.egg-info/top_level.txt +0 -0
  41. {agora_python_server_sdk-2.2.0 → agora_python_server_sdk-2.2.1}/pyproject.toml +0 -0
  42. {agora_python_server_sdk-2.2.0 → agora_python_server_sdk-2.2.1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: agora_python_server_sdk
3
- Version: 2.2.0
3
+ Version: 2.2.1
4
4
  Summary: A Python SDK for Agora Server
5
5
  Home-page: https://github.com/AgoraIO-Extensions/Agora-Python-Server-SDK
6
6
  Classifier: Intended Audience :: Developers
@@ -12,6 +12,12 @@ Classifier: Programming Language :: Python :: 3.10
12
12
  Classifier: Programming Language :: Python :: 3 :: Only
13
13
  Requires-Python: >=3.10
14
14
  Description-Content-Type: text/markdown
15
+ Dynamic: classifier
16
+ Dynamic: description
17
+ Dynamic: description-content-type
18
+ Dynamic: home-page
19
+ Dynamic: requires-python
20
+ Dynamic: summary
15
21
 
16
22
  # Note
17
23
  - This is a Python SDK wrapper for the Agora RTC SDK.
@@ -50,6 +56,13 @@ python agora_rtc/examples/example_audio_pcm_send.py --appId=xxx --channelId=xxx
50
56
  ```
51
57
 
52
58
  # Change log
59
+ 2025.02.26 Release 2.2.1
60
+ --Update:
61
+ ​- Reduced buffer size from ​180ms​ to ​100ms​ to minimize latency.
62
+ -- Added:
63
+ - AudioConsumer::is_push_to_rtc_completed: Add audio consumer support for playback state notifications.
64
+ -- ​Bug fix:
65
+ - Fixed incorrect _samples_per_channel calculation in stereo mode.
53
66
 
54
67
  2025.01.08 Release 2.2.0
55
68
  -- Updates:
@@ -35,6 +35,13 @@ python agora_rtc/examples/example_audio_pcm_send.py --appId=xxx --channelId=xxx
35
35
  ```
36
36
 
37
37
  # Change log
38
+ 2025.02.26 Release 2.2.1
39
+ --Update:
40
+ ​- Reduced buffer size from ​180ms​ to ​100ms​ to minimize latency.
41
+ -- Added:
42
+ - AudioConsumer::is_push_to_rtc_completed: Add audio consumer support for playback state notifications.
43
+ -- ​Bug fix:
44
+ - Fixed incorrect _samples_per_channel calculation in stereo mode.
38
45
 
39
46
  2025.01.08 Release 2.2.0
40
47
  -- Updates:
@@ -809,12 +809,13 @@ class ExternalVideoFrameInner(ctypes.Structure):
809
809
  else:
810
810
  c_alpha_buffer_ptr = ctypes.c_void_p(0)
811
811
 
812
- c_metadata_size = len (frame.metadata)
812
+ c_metadata_size = len (frame.metadata) if frame.metadata is not None else 0
813
813
  if frame.metadata is not None and c_metadata_size > 0:
814
814
  c_metadata_ptr = (ctypes.c_uint8 * len(frame.metadata)).from_buffer(frame.metadata)
815
815
  c_metadata_size = len(frame.metadata)
816
816
  else:
817
- c_metadata_ptr = ctypes.c_void_p(0)
817
+ #c_metadata_ptr = ctypes.c_void_p(0)
818
+ c_metadata_ptr = ctypes.POINTER(ctypes.c_uint8)()
818
819
  c_metadata_size = 0
819
820
 
820
821
 
@@ -31,6 +31,8 @@ AudioConsumer调用方式:
31
31
  E 退出的时候,调用release()方法,释放资源
32
32
  """
33
33
  class AudioConsumer:
34
+ MIN_BUFFER_SIZE = 10
35
+ RTC_E2E_DELAY = 200 # e2e delay 90ms for iphone, 120ms for android;150ms for web. so we use 200ms here
34
36
  def __init__(self, pcm_sender: AudioPcmDataSender, sample_rate: int, channels: int) -> None:
35
37
  self._lock = threading.Lock()
36
38
  self._start_time = 0
@@ -45,11 +47,12 @@ class AudioConsumer:
45
47
  #audio parame
46
48
  self._frame.bytes_per_sample = 2
47
49
  self._bytes_per_frame = sample_rate // 100 * channels * 2
48
- self._samples_per_channel = sample_rate // 100* channels
50
+ self._samples_per_channel = sample_rate // 100
49
51
  #init pcmaudioframe
50
52
  self._frame.timestamp = 0
51
53
 
52
54
  self._init = True
55
+ self._last_consume_time = 0
53
56
 
54
57
  pass
55
58
  def push_pcm_data(self, data) ->None:
@@ -64,6 +67,7 @@ class AudioConsumer:
64
67
  return
65
68
  self._start_time = time.time()*1000
66
69
  self._consumed_packages = 0
70
+ self._last_consume_time = self._start_time
67
71
  pass
68
72
 
69
73
  def consume(self):
@@ -75,13 +79,16 @@ class AudioConsumer:
75
79
  expected_total_packages = int(elapsed_time//10)
76
80
  besent_packages = expected_total_packages - self._consumed_packages
77
81
  data_len = len(self._data)
82
+ #if data is not empty, to update last consume time
83
+ if data_len > 0:
84
+ self._last_consume_time = now
78
85
 
79
- if besent_packages > 18 and data_len //self._bytes_per_frame < 18: #for fist time, if data_len is not enough, just return and wait for next time
86
+ if besent_packages > AudioConsumer.MIN_BUFFER_SIZE and data_len //self._bytes_per_frame < AudioConsumer.MIN_BUFFER_SIZE: #for fist time, if data_len is not enough, just return and wait for next time
80
87
  #print("-----underflow data")
81
88
  return -2
82
- if besent_packages > 18: #rest to start state, push 18 packs in Start_STATE
89
+ if besent_packages > AudioConsumer.MIN_BUFFER_SIZE: #rest to start state, push 18 packs in Start_STATE
83
90
  self._reset()
84
- besent_packages = min(18, data_len//self._bytes_per_frame)
91
+ besent_packages = min(AudioConsumer.MIN_BUFFER_SIZE, data_len//self._bytes_per_frame)
85
92
  self._consumed_packages = -besent_packages
86
93
 
87
94
 
@@ -113,6 +120,25 @@ class AudioConsumer:
113
120
  return 0
114
121
  with self._lock:
115
122
  return len(self._data)
123
+
124
+ #判断AudioConsumer中的数据是否已经完全推送给了RTC 频道
125
+ #因为audioconsumer内部有一定的缓存机制,所以当get_remaining_data_size 返回是0的时候,还有数据没有推送给
126
+ #rtc 频道。如果要判断数据是否完全推送给了rtc 频道,需要调用这个api来做判断。
127
+ #return value:1--push to rtc completed, 0--push to rtc not completed -1--error
128
+ def is_push_to_rtc_completed(self)->int:
129
+ if self._init == False:
130
+ return -1
131
+ with self._lock:
132
+ remain_size = len(self._data)
133
+ if remain_size == 0:
134
+ now = time.time()*1000
135
+ diff = now - self._last_consume_time
136
+
137
+ if diff > AudioConsumer.MIN_BUFFER_SIZE*10 + AudioConsumer.RTC_E2E_DELAY:
138
+ return 1
139
+
140
+ return 0
141
+ pass
116
142
  def clear(self):
117
143
  if self._init == False:
118
144
  return
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: agora_python_server_sdk
3
- Version: 2.2.0
3
+ Version: 2.2.1
4
4
  Summary: A Python SDK for Agora Server
5
5
  Home-page: https://github.com/AgoraIO-Extensions/Agora-Python-Server-SDK
6
6
  Classifier: Intended Audience :: Developers
@@ -12,6 +12,12 @@ Classifier: Programming Language :: Python :: 3.10
12
12
  Classifier: Programming Language :: Python :: 3 :: Only
13
13
  Requires-Python: >=3.10
14
14
  Description-Content-Type: text/markdown
15
+ Dynamic: classifier
16
+ Dynamic: description
17
+ Dynamic: description-content-type
18
+ Dynamic: home-page
19
+ Dynamic: requires-python
20
+ Dynamic: summary
15
21
 
16
22
  # Note
17
23
  - This is a Python SDK wrapper for the Agora RTC SDK.
@@ -50,6 +56,13 @@ python agora_rtc/examples/example_audio_pcm_send.py --appId=xxx --channelId=xxx
50
56
  ```
51
57
 
52
58
  # Change log
59
+ 2025.02.26 Release 2.2.1
60
+ --Update:
61
+ ​- Reduced buffer size from ​180ms​ to ​100ms​ to minimize latency.
62
+ -- Added:
63
+ - AudioConsumer::is_push_to_rtc_completed: Add audio consumer support for playback state notifications.
64
+ -- ​Bug fix:
65
+ - Fixed incorrect _samples_per_channel calculation in stereo mode.
53
66
 
54
67
  2025.01.08 Release 2.2.0
55
68
  -- Updates:
@@ -50,7 +50,7 @@ class CustomInstallCommand(install):
50
50
 
51
51
  setup(
52
52
  name='agora_python_server_sdk',
53
- version='2.2.0',
53
+ version='2.2.1',
54
54
  description='A Python SDK for Agora Server',
55
55
  long_description=open('README.md').read(),
56
56
  long_description_content_type='text/markdown',