자산 디렉토리에서 오디오 파일 재생 내가 뭘

다음 코드가 있습니다.

AssetFileDescriptor afd = getAssets().openFd("AudioFile.mp3");
player = new MediaPlayer();
player.setDataSource(afd.getFileDescriptor());
player.prepare();
player.start();

문제는이 코드를 실행하면 요청한 오디오 파일을 재생하는 대신 에셋 디렉토리의 모든 오디오 파일을 알파벳순으로 재생하기 시작한다는 것입니다. 내가 뭘 잘못하고 있죠? 자산 디렉토리에서 오디오 파일을 재생하는 더 좋은 방법이 있습니까?

후속 질문 : 자산 디렉토리에 오디오 파일을 보관하는 것과 res / raw 디렉토리에 보관하는 것 사이에 차이가 있습니까? 자산 디렉토리에 있으면 ID를 얻지 못한다는 사실 외에도. 오디오 파일을 res / raw 폴더로 이동하면 .에 MediaPlayer대한 id 매개 변수가 없기 때문에 s 를 재사용하는 데 문제가 setDataSource()있습니다. 이런 종류의 문제를 처리하기위한 좋은 지침을 찾을 수 없습니다.



답변

player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());

자산 디렉토리에 파일이 하나만 있으면 버전이 작동합니다. 자산 디렉토리 내용은 실제로 디스크의 ‘실제 파일’이 아닙니다. 그들 모두가 차례로 모입니다. 따라서 시작할 위치와 읽을 바이트 수를 지정하지 않으면 플레이어가 끝까지 읽습니다 (즉, 자산 디렉토리의 모든 파일을 계속 재생합니다).


답변

이 기능은 제대로 작동합니다. 🙂

// MediaPlayer m; /*assume, somewhere in the global scope...*/

public void playBeep() {
    try {
        if (m.isPlaying()) {
            m.stop();
            m.release();
            m = new MediaPlayer();
        }

        AssetFileDescriptor descriptor = getAssets().openFd("beepbeep.mp3");
        m.setDataSource(descriptor.getFileDescriptor(), descriptor.getStartOffset(), descriptor.getLength());
        descriptor.close();

        m.prepare();
        m.setVolume(1f, 1f);
        m.setLooping(true);
        m.start();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

답변

여기 내 정적 버전 :

public static void playAssetSound(Context context, String soundFileName) {
    try {
        MediaPlayer mediaPlayer = new MediaPlayer();

        AssetFileDescriptor descriptor = context.getAssets().openFd(soundFileName);
        mediaPlayer.setDataSource(descriptor.getFileDescriptor(), descriptor.getStartOffset(), descriptor.getLength());
        descriptor.close();

        mediaPlayer.prepare();
        mediaPlayer.setVolume(1f, 1f);
        mediaPlayer.setLooping(false);
        mediaPlayer.start();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

답변

위의 재생 및 일시 중지 기능 수정

  public void playBeep ( String word )
{
    try
    {
        if ( ( m == null ) )
        {

            m = new MediaPlayer ();
        }
        else if( m != null&&lastPlayed.equalsIgnoreCase (word)){
            m.stop();
            m.release ();
            m=null;
            lastPlayed="";
            return;
        }else if(m != null){
            m.release ();
            m = new MediaPlayer ();
        }
        lastPlayed=word;

        AssetFileDescriptor descriptor = context.getAssets ().openFd ( "rings/" + word + ".mp3" );
        long                start      = descriptor.getStartOffset ();
        long                end        = descriptor.getLength ();

        // get title
        // songTitle=songsList.get(songIndex).get("songTitle");
        // set the data source
        try
        {
            m.setDataSource ( descriptor.getFileDescriptor (), start, end );
        }
        catch ( Exception e )
        {
            Log.e ( "MUSIC SERVICE", "Error setting data source", e );
        }

        m.prepare ();
        m.setVolume ( 1f, 1f );
        // m.setLooping(true);
        m.start ();
    }
    catch ( Exception e )
    {
        e.printStackTrace ();
    }
}

답변

시작 소리

startSound("mp3/ba.mp3");

방법

private void startSound(String filename) {
    AssetFileDescriptor afd = null;
    try {
        afd = getResources().getAssets().openFd(filename);
    } catch (IOException e) {
        e.printStackTrace();
    }
    MediaPlayer player = new MediaPlayer();
    try {
        assert afd != null;
        player.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        player.prepare();
    } catch (IOException e) {
        e.printStackTrace();
    }
    player.start();
}

답변

이것은 나를 위해 작동합니다.

public static class eSound_Def
{
  private static Android.Media.MediaPlayer mpBeep;

  public static void InitSounds( Android.Content.Res.AssetManager Assets )
  {
    mpBeep = new Android.Media.MediaPlayer();

    InitSound_Beep( Assets );
  }

  private static void InitSound_Beep( Android.Content.Res.AssetManager Assets )
  {
    Android.Content.Res.AssetFileDescriptor AFD;

    AFD = Assets.OpenFd( "Sounds/beep-06.mp3" );
    mpBeep.SetDataSource( AFD.FileDescriptor, AFD.StartOffset, AFD.Length );
    AFD.Close();

    mpBeep.Prepare();
    mpBeep.SetVolume( 1f, 1f );
    mpBeep.Looping = false;
  }

  public static void PlaySound_Beep()
  {
    if (mpBeep.IsPlaying == true)
    {
      mpBeep.Stop();
      mpBeep.Reset();
      InitSound_Beep();
    }
    mpBeep.Start();
  }
}

주요 활동에서 생성시 :

protected override void OnCreate( Bundle savedInstanceState )
{
  base.OnCreate( savedInstanceState );
  SetContentView( Resource.Layout.lmain_activity );
  ...
  eSound_Def.InitSounds( Assets );
  ...
}

코드에서 사용하는 방법 (버튼 클릭시) :

private void bButton_Click( object sender, EventArgs e )
{
  eSound_Def.PlaySound_Beep();
}