I'm creating android app that receive on socket decoded mp3 music from python server. When I try to play back the music received in the stream using the pyjnius library and android audiotrack there is absolutely no sound on the phone. Сlient on Windows works fine.
I tried change every parameter of audiotrack but in vain. Also tried just playing a piece of sound, but it's the same. Probably I use write() in wrong way and I need somehow change format of data.
Client:
host_ip = '192.168.1.205'
print(host_ip)
port = 33
sample = 44100
client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
socket_address = (host_ip,port)
print('server listening at',socket_address)
client_socket.connect(socket_address)
print("CLIENT CONNECTED TO",socket_address)
AudioTrack = autoclass('android.media.AudioTrack')
AudioManager = autoclass('android.media.AudioManager')
AudioFormat = autoclass('android.media.AudioFormat')
AudioRecord = autoclass('android.media.AudioRecord')
sample = AudioTrack.getNativeOutputSampleRate(
AudioManager.USE_DEFAULT_STREAM_TYPE
)
n = AudioRecord.getMinBufferSize(
sample,
AudioFormat.CHANNEL_OUT_STEREO,
AudioFormat.ENCODING_PCM_16BIT,
)
audio_stream = AudioTrack(
AudioManager.STREAM_MUSIC,
sample,
AudioFormat.CHANNEL_OUT_STEREO,
AudioFormat.ENCODING_PCM_16BIT,
n,
AudioTrack.MODE_STREAM,
)
audio_stream.play()
data = b""
payload_size = struct.calcsize("Q")
while True:
while len(data) < payload_size:
packet = client_socket.recv(4*1024)
if not packet: break
data+=packet
packed_msg_size = data[:payload_size]
data = data[payload_size:]
msg_size = struct.unpack("Q",packed_msg_size)[0]
while len(data) < msg_size:
data += client_socket.recv(4*1024)
frame_data = data[:msg_size]
data = data[msg_size:]
frame = pickle.loads(frame_data)
audio_stream.write(frame, 0, n)
await asyncio.sleep(0.00001)
Server:
global wf
client_socket, address = server_socket.accept()
connections.append(client_socket)
t2 = threading.Thread(target=connect, args=())
t2.start()
chunk = 1024
sample_rate = 44100
p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paInt16,
channels=1,
rate=sample_rate,
input=True,
output=True,
frames_per_buffer=chunk)
data = None
while True:
while len(connections) != 0:
with io.BytesIO(wf) as f:
f.seek(chunk)
data = f.read(chunk)
while data:
a = pickle.dumps(data)
message = struct.pack("Q",len(a))+a
for client in connections:
try:
client.sendall(message)
except:
connections.remove(client)
data = f.read(chunk)
wf = AudioSegment.from_mp3(getSong())._data