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


126

다음 코드가 있습니다.

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()있습니다. 이런 종류의 문제를 처리하기위한 좋은 지침을 찾을 수 없습니다.

답변:


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

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


1
효과가있었습니다. 감사. 하지만 내 버전도 작동해야한다고 생각합니다.
Catalin Morosan 2010 년

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

1
이것은 내가 사용하고있는 코드 경로이지만 작동하지 않습니다 stackoverflow.com/questions/9124378/...
티모시 리 러셀

1
애셋 파일에 대한 완전히 관련없는 질문에 답 해주신 +1!
jjm

자산 디렉토리의 구현에 의해 날려 @SarwarErfan 마음> _ <
Warpzit

74

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

// 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();
    }
}

3
m은 무엇입니까? 초기화 중입니다 m = new MediaPlayer (); 후에 사용 했습니까?
Umer

안녕하세요 @Umar, 전역 변수 MediaPlayer m = null을 사용했습니다. 그때 나는 () playBeep에 할당 한 기능
Siddhpura 미트

명심 하거나 다른 참조MediaPlayer m있어야합니다 . 참조없이 함수에있는 경우 "수집"합니다.staticmGC
Menelaos Kotsollaris 2015 년

오디오가 끝까지 재생되지 않는 경우가 있습니다.
user7856586

진실로 반복하는 것은 영원히 재생되는 것입니까?
gumuruh

4

여기 내 정적 버전 :

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();
    }
}

1

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

  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 ();
    }
}

1

여기에 이미지 설명 입력

시작 소리

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();
}

-4

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

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();
}

WWWWWeUNIS 란 무엇입니까?
Dyno Cris

eUNIS는 애플리케이션 자산에 대한 참조 인 가변 자산이있는 사용자 정의 정적 클래스입니다.
Altivo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.