質問編集履歴

1

sounddeviceを使用して、AudioFrameを処理

2025/01/10 08:02

投稿

hyt30
hyt30

スコア1

test CHANGED
File without changes
test CHANGED
@@ -8,20 +8,45 @@
8
8
 
9
9
  ### 発生している問題・エラーメッセージ
10
10
  ピア接続が確立後、
11
- 以下のコードで、オーディオトラックリモートから受け取っていることは確認ました。
11
+ 以下のコードで、PyAVのAudioFrameNumpy配列に変換
12
- しかしこの送り続けられるオーディオデータをどのように再生たらいかわかりせん
12
+ ノンブロッキングにwirte()いま
13
13
 
14
- PyAudioや、sounddeviceで再生したらいいのは何となくるのですが、
14
+ wirte()が5回ほど行と、フリーズしてしまうのですが、
15
- データの変換等、理解出来ず、どのよにしたらいいご教示ください。
15
+ 原因は何考えられるでしょうか
16
16
 
17
17
 
18
18
  ### 該当のソースコード
19
19
 
20
20
  ```python
21
+ import sounddevice as sd
22
+ import numpy as np
23
+
24
+ # リモートのトラックを受信する
21
- @peer_connection.on("track")
25
+ @peer_connection.on("track")
22
- async def on_track(track):
26
+ async def on_track(track):
23
- print("receive track")
27
+ print("receive track")
24
- if track.kind == "audio":
28
+ if track.kind == "audio":
25
- print("audio track")
29
+ print("audio track")
30
+ sample_rate = 48000 # サンプルレートを定義
31
+ channels = 2 # ステレオなのでチャンネル数を2に設定
32
+
33
+ stream = sd.OutputStream(samplerate=sample_rate, channels=channels)
34
+
35
+ stream.start()
36
+
37
+ try:
38
+ while True:
39
+ frame = await track.recv()
40
+ # pyavのAudioFrameをnumpy配列に変換
41
+ frame_data = frame.to_ndarray()
42
+ stereo_data = frame_data.reshape(960, 2)
43
+ print(f"Channels: {len(frame.layout.channels)}, Shape: {stereo_data.shape}")
44
+ # sounddeviceで再生
45
+ stream.write(stereo_data.astype(np.float32).copy())
46
+ except Exception as e:
47
+ print(f"Error during audio playback: {e}")
48
+ finally:
49
+ stream.stop()
50
+ stream.close()
26
51
  ```
27
52