เล่นไฟล์เสียงจากไดเร็กทอรีสินทรัพย์


126

ฉันมีรหัสต่อไปนี้:

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

ปัญหาคือเมื่อฉันเรียกใช้โค้ดนี้มันจะเริ่มเล่นไฟล์เสียงทั้งหมดในไดเร็กทอรีสินทรัพย์ตามลำดับตัวอักษรแทนที่จะเล่นไฟล์เสียงที่ฉันร้องขอ ผมทำอะไรผิดหรือเปล่า? มีวิธีที่ดีกว่าในการเล่นไฟล์เสียงจากไดเรกทอรีเนื้อหาหรือไม่

คำถามติดตามผล: มีความแตกต่างระหว่างการเก็บไฟล์เสียงในไดเร็กทอรีสินทรัพย์และเก็บไว้ในไดเร็กทอรี res / raw หรือไม่ นอกจากข้อเท็จจริงที่ว่าพวกเขาไม่ได้รับรหัสหากอยู่ในไดเรกทอรีเนื้อหา หากฉันย้ายไฟล์เสียงไปยังโฟลเดอร์ res / raw แสดงว่าฉันมีปัญหากับการนำMediaPlayers กลับมาใช้ใหม่เนื่องจากไม่มีพารามิเตอร์ id สำหรับsetDataSource(). ฉันไม่พบแนวทางที่ดีในการจัดการปัญหาประเภทนี้

คำตอบ:


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

เวอร์ชันของคุณจะใช้งานได้หากคุณมีเพียงไฟล์เดียวในไดเรกทอรีเนื้อหา เนื้อหาไดเรกทอรีเนื้อหาไม่ใช่ 'ไฟล์จริง' บนดิสก์ พวกเขาทั้งหมดจะรวมกันทีละคน ดังนั้นหากคุณไม่ระบุตำแหน่งที่จะเริ่มต้นและจำนวนไบต์ที่จะอ่านผู้เล่นจะอ่านจนจบ (นั่นคือจะเล่นไฟล์ทั้งหมดในไดเรกทอรีเนื้อหาต่อไป)


1
มันได้ผล ขอบคุณ แต่ฉันคิดว่าเวอร์ชันของฉันก็น่าจะใช้ได้เช่นกัน
Catalin Morosan

57
เวอร์ชันของคุณจะใช้งานได้หากคุณมีเพียงไฟล์เดียวในไดเรกทอรีเนื้อหา เนื้อหาไดเรกทอรีเนื้อหาไม่ใช่ 'ไฟล์จริง' บนดิสก์ พวกเขาทั้งหมดจะรวมกันทีละคน ดังนั้นหากคุณไม่ระบุตำแหน่งที่จะเริ่มต้นและจำนวนไบต์ที่จะอ่านผู้เล่นจะอ่านจนจบ (นั่นคือจะเล่นไฟล์ทั้งหมดในไดเรกทอรีเนื้อหาต่อไป)
Sarwar Erfan

1
นี่คือเส้นทางรหัสที่ฉันใช้ แต่ใช้ไม่ได้: stackoverflow.com/questions/9124378/…
Timothy Lee Russell

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 = MediaPlayer ใหม่ (); หลังและเคยใช้มาก่อน?
Umer

สวัสดี @ อูมาฉันใช้ตัวแปร Global MediaPlayer m = null; จากนั้นฉันได้กำหนดในฟังก์ชั่น playBeep ()
Siddhpura Amit

เก็บไว้ในใจMediaPlayer mต้องstaticหรือมีอีกอ้างอิง หากคุณมีmในฟังก์ชันโดยไม่มีการอ้างอิงใด ๆGCจะ "รวบรวม" มัน
Menelaos Kotsollaris

บางครั้งเสียงไม่เล่นจนจบ
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();
}

WWWWW eUNIS คืออะไร?
Dyno Cris

eUNIS เป็นคลาสแบบคงที่ที่กำหนดเองโดยมี Assets ตัวแปรซึ่งอ้างอิงถึงแอปพลิเคชันแอสเซท
Altivo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.