संपत्ति निर्देशिका से ऑडियो फ़ाइल चलाएं


126

मेरे पास निम्नलिखित कोड हैं:

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

समस्या यह है कि, जब मैं इस कोड को चलाता हूं, तो यह मेरे द्वारा अनुरोध किए गए ऑडियो फ़ाइल को चलाने के बजाय केवल वर्णमाला क्रम में, संपत्ति निर्देशिका में सभी ऑडियो फ़ाइलों को खेलना शुरू करता है। मैं क्या गलत कर रहा हूं? क्या संपत्ति निर्देशिका से ऑडियो फ़ाइलों को चलाने का एक बेहतर तरीका है?

अनुवर्ती प्रश्न: क्या संपत्ति निर्देशिका में ऑडियो फ़ाइलों को रखने और उन्हें Res / कच्चे निर्देशिका में रखने के बीच अंतर है? इस तथ्य के अलावा कि अगर वे संपत्ति निर्देशिका में हैं, तो उन्हें आईडी नहीं मिलता है। अगर मैं ऑडियो फाइलों को रेज / रॉ फोल्डर में स्थानांतरित करता हूं तो मुझे पुनः उपयोग करने में समस्या है MediaPlayerक्योंकि इसमें कोई आईडी पैरामीटर नहीं है setDataSource()। मुझे इस तरह की समस्या से निपटने के लिए एक अच्छी गाइडलाइन नहीं मिल सकती है।

जवाबों:


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

यदि आपके पास संपत्ति निर्देशिका में केवल एक फ़ाइल थी तो आपका संस्करण काम करेगा। संपत्ति निर्देशिका सामग्री वास्तव में डिस्क पर 'वास्तविक फाइलें' नहीं हैं। उन सभी को एक के बाद एक साथ रखा जाता है। इसलिए, यदि आप निर्दिष्ट नहीं करते हैं कि कहां से शुरू करना है और कितने बाइट्स पढ़ना है, तो खिलाड़ी अंत तक पढ़ेगा (अर्थात, संपत्ति निर्देशिका में सभी फ़ाइलों को खेलता रहेगा)


1
इसने काम कर दिया। धन्यवाद। लेकिन मुझे लगता है कि मेरे संस्करण को भी काम करना चाहिए था।
कैटालिन मोरोसन

57
यदि आपके पास संपत्ति निर्देशिका में केवल एक फ़ाइल थी तो आपका संस्करण काम करेगा। संपत्ति निर्देशिका सामग्री वास्तव में डिस्क पर 'वास्तविक फाइलें' नहीं हैं। उन सभी को एक के बाद एक साथ रखा जाता है। इसलिए, यदि आप निर्दिष्ट नहीं करते हैं कि कहां से शुरू करना है और कितने बाइट्स पढ़ना है, तो खिलाड़ी अंत तक पढ़ेगा (यानी, संपत्ति निर्देशिका में सभी फाइलें खेलता रहेगा)
सरवर इरफान

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 = new MediaPlayer () आरंभ कर रहे हैं; बाद और यह पहले इस्तेमाल किया?
उमर

हाय @ उमर, मैंने ग्लोबल वैरिएबल MediaPlayer m = null लिया है; तब मैंने प्लेबिप () फ़ंक्शन
सिद्धपुरा अमित

ध्यान रखें दूसरा संदर्भMediaPlayer m होना चाहिए staticया होना चाहिए । यदि आप किसी भी संदर्भ के बिना एक समारोह में हैं, तो इसे "एकत्रित" करेंगेmGC
मेनेलाओस कोत्सोलारिस

कभी-कभी ऑडियो अंत तक नहीं
चलता है

सच है कि हमेशा के लिए खेल रहा है?
गुमराह

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

WWWWWWUN क्या है?
डायनो क्राइस

eUNIS वैरिएबल एसेट्स के साथ कस्टम स्टैटिक क्लास है, जो कि एप्लीकेशन एसेट्स के संदर्भ में है।
अल्टिवो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.