我正在制作两个应用程序 - 接收器和发送器,每个应用程序都在Android设备上运行。发送方应该能够通过Wifi将本地音频文件流式传输到接收方,最好使用UDP或RTP。
我已经制作了接收器应用程序,它可以在互联网广播电台上运行良好,但现在的麻烦在于制作发送者应用程序。我无法在网上找到任何可靠的资源。 我提到的一些资源以及他们没有帮助的原因:
#1 Audiotrack不支持mp3,这将是一个主要的劣势。
#2
这使用了一种名为ParcelFileDescriptor的东西。这是否是读取太多不熟悉的API的结果,我只是无法理解该行ParcelFileDescriptor socketedFile = ParcelFileDescriptor.fromSocket(socket)
正在做什么。它似乎是从parcelfiledescriptor
创建一个新的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 + "%");
}
}