1

私は受信機と送信機の 2 つのアプリを作成しています。それぞれが Android デバイス上で動作します。送信者は、できれば UDP または RTP を使用して、Wifi 経由でローカル オーディオ ファイルを受信者にストリーミングできる必要があります。

受信アプリは作りましたが、インターネットラジオ局などは問題なく動きますが、問題は送信アプリの作成です。信頼できるリソースをオンラインで見つけることができませんでした。私が参照したいくつかのリソースと、それらが役に立たなかった理由:

#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 + "%");
 }

}
4

0 に答える 0