PC (C++ アプリケーション、FMOD-API を使用してオーディオ データをデコードし、UDP ソケット経由で送信) から Android デバイスにオーディオ ストリームを送信したいと考えています。通信はすでに機能しており、Android で「サウンド」(100 ミリ秒のサウンドに続いて 900 ミリ秒の沈黙が交互に続く) を聞くことができます。
音が途切れる理由はわかりません。PC では、同じオーディオ ストリームが高品質で正常に再生されます。問題はAndroidにあると思います..
コードは次のとおりです。
DatagramSocket sock = new DatagramSocket(12345);
byte []bSockBuffer = new byte[1024];
byte []bRecvBufTmp;
int iAudioBufSize, iCurAudioBufPos = 0;
sock.setReceiveBufferSize(bSockBuffer.length);
// Audio Stream initialisieren:
iAudioBufSize = AudioTrack.getMinBufferSize(44100, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT);
AudioTrack track = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_OUT_STEREO,
AudioFormat.ENCODING_PCM_16BIT, iAudioBufSize, AudioTrack.MODE_STREAM);
track.play();
while (true)
{
DatagramPacket pack = new DatagramPacket(bSockBuffer, bSockBuffer.length);
// Paket empfangen:
sock.receive(pack);
track.write(pack.getData(), 0, pack.getLength());
}
「AudioTrack」オブジェクトを正しく設定したことを確認してください。設定は、C++ アプリケーションの設定と比較されます。
もう 1 つのステップは、受信したソケット データを一時的な「byte[]」変数に事前にバッファリングし、バッファのサイズ「iAudioBufSize」に達したときにそれを AudioTrack オブジェクトに書き込むことでした。これは役に立ちませんでした。
何かアイデアはありますか?ありがとう
[編集] C++ アプリケーションのコード、FMOD API の例のサンプル「manualdecode」を使用:
FMOD_RESULT F_CALLBACK pcmreadcallback(FMOD_SOUND *sound, void *data, unsigned int datalen)
{
CCtrlSocket *cClientTmp = /* Obtaining target client sock here */;
FMOD_RESULT result;
unsigned int read, uSentTmp, uSizeTmp;
EnterCriticalSection(&decodecrit);
if (!decodesound)
return (FMOD_ERR_FILE_EOF);
result = decodesound->readData(data, datalen, &read);
if (result == FMOD_ERR_FILE_EOF)
{
// Handle looping:
decodesound->seekData(0);
datalen -= read;
result = decodesound->readData((char*) data + read, datalen, &read);
}
// Split package in multiple parts:
uSentTmp = 0;
do
{
uSizeTmp = (read - uSentTmp);
if (uSizeTmp > 1024)
uSizeTmp = 1024;
uSentTmp += cClientTmp->SendAudioData((char*) data + uSentTmp, uSizeTmp);
} while (uSentTmp < read);
LeaveCriticalSection(&decodecrit);
return (FMOD_OK);
}