我正在制作两个应用程序 - 接收器和发送器,每个应用程序都在 Android 设备上运行。发送方应该能够通过 Wifi 将本地音频文件流式传输到接收方,最好使用 UDP 或 RTP。
我已经制作了接收器应用程序,它在互联网广播电台和所有地方运行良好,但现在的问题在于制作发送器应用程序。我一直无法在网上找到任何可靠的资源。我提到的一些资源以及为什么它们没有帮助:
#1 Audiotrack 不支持 mp3,这将是一个主要缺点。
#2
这使用了一个叫做 ParcelFileDescriptor 的东西。无论这是否是阅读太多不熟悉的 API 的结果,我都无法理解该行在ParcelFileDescriptor socketedFile = ParcelFileDescriptor.fromSocket(socket)
做什么。它似乎正在创建一个新parcelfiledescriptor
的 from socket
,但我认为代码应该将它发送到socket
.
那么任何人都可以建议替代方案或修改上述适用于我的应用程序的代码类型吗?供您参考,我附上了接收方应用程序的源代码。
package com.example.audioclient;
import java.io.IOException;
import android.media.*;
import android.media.MediaPlayer.*;
import android.media.MediaPlayer.OnPreparedListener;
import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class RTPClient extends Activity implements MediaPlayer.OnCompletionListener, MediaPlayer.OnPreparedListener, MediaPlayer.OnErrorListener, MediaPlayer.OnBufferingUpdateListener{
String URL_OF_FILE = "http://fr3.ah.fm:9000";
private String TAG = getClass().getSimpleName();
private MediaPlayer mp = null;
private Button play;
private Button pause;
private Button stop;
private EditText tv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
play = (Button) findViewById(R.id.play);
//pause = (Button) findViewById(R.id.pause);
stop = (Button) findViewById(R.id.stop);
tv = (EditText) findViewById(R.id.editText1);
//URL_OF_FILE = tv.getText().toString();
play.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
play();
}
});
/*pause.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
pause();
}
});*/
stop.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
stop();
}
});
}
private void play() {
//Uri myUri = Uri.parse("http://currentstream1.publicradio.org:80/");
URL_OF_FILE = tv.getText().toString();
Uri myUri = Uri.parse(URL_OF_FILE);
try {
if (mp == null) {
this.mp = new MediaPlayer();
} else {
mp.stop();
mp.reset();
}
mp.setDataSource(this, myUri); // Go to Initialized state
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.setOnPreparedListener(this);
mp.setOnBufferingUpdateListener(this);
mp.setOnErrorListener(this);
mp.prepareAsync();
Log.d(TAG, "LoadClip Done");
} catch (Throwable t) {
Log.d(TAG, t.toString());
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
StringBuilder sb = new StringBuilder();
sb.append("Media Player Error: ");
switch (what) {
case MediaPlayer.MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK:
sb.append("Not Valid for Progressive Playback");
break;
case MediaPlayer.MEDIA_ERROR_SERVER_DIED:
sb.append("Server Died");
break;
case MediaPlayer.MEDIA_ERROR_UNKNOWN:
sb.append("Unknown");
break;
default:
sb.append(" Non standard (");
sb.append(what);
sb.append(")");
}
sb.append(" (" + what + ") ");
sb.append(extra);
Log.e(TAG, sb.toString());
return true;
}
@Override
public void onPrepared(MediaPlayer mp) {
Log.d(TAG, "Stream is prepared");
mp.start();
}
private void pause() {
mp.pause();
}
private void stop() {
mp.stop();
}
@Override
public void onDestroy() {
super.onDestroy();
stop();
}
public void onCompletion(MediaPlayer mp) {
stop();
}
public void onBufferingUpdate(MediaPlayer mp, int percent) {
Log.d(TAG, "PlayerService onBufferingUpdate : " + percent + "%");
}
}