2011-12-24 17 views
8

मुझे ऑडियो फ़ाइल खेलनी है। जो ज़िप फ़ाइल में है, जो एसडीकार्ड में मौजूद है। और ऑडियो फ़ाइल एन्क्रिप्टेड है। तो ऑडियो डिक्रिप्ट करते समय, मुझे इनपुटस्ट्रीम में डेटा मिल जाएगा।मैं पूरी फ़ाइल को डिकंप्रेस किए बिना एन्क्रिप्टेड ज़िप के अंदर फ़ाइल से संगीत कैसे स्ट्रीम करूं?

मैं अनजिप नहीं करना चाहता क्योंकि यह डिस्क पर स्थान खाता है।

जैसा कि मैंने जांच की है, मुझे स्ट्रीम नहीं होने पर ऑडियो को सीधे चलाने के तरीके पर संकेत नहीं मिला है। नेटवर्क पर यह केवल एकमात्र संभव है। जो इस मामले में नहीं है।

तो मैंने जो सोचा था वह एक धागा उत्पन्न करना है जो फ़ाइल में डेटा (बाइट्स) जोड़ना जारी रखेगा। जैसे ही यह शुरू होता है, मैं अपनी नौकरी शुरू करने के लिए MediadPlayer पर कॉल कर रहा हूं।

मीडिया प्लेयर ठीक है। मज़ा यहां शुरू होता है: मान लें कि ऑडियो फ़ाइल 6min - 5MB में है। बफरिंग 2 एमबी के लिए हो सकती है। तलाश बार में मैं अपनी अधिकतम अवधि के रूप में 2min के लिए देख सकता हूं। यह बिल्कुल सही है। जब बफरिंग अभी भी जारी है .. हो रहा है, मैं तलाश बार में समय अपडेट करना चाहता हूं और इसकी लंबाई (बार बार की तलाश करें) दिए गए समय के लिए सीधे आनुपातिक है। यह कैसे करना है।

मैंने इसके लिए ऑनबफिंग करने की कोशिश की, यह काम नहीं किया। मुझे लगता है कि यह वास्तव में ऑडियो फाइल स्ट्रीमिंग के लिए है, अगर यह नेटवर्क पर खेला जाता है।

कृपया मुझे कुछ आसान समाधान दें, यह कैसे किया जाए? मुझे MediaPlayer कक्षा को ओवरराइड करने के लिए मत कहें और उस पर काम करें।

किसी भी मदद की सराहना की जाती है। अगर आपको इस पर अधिक स्पष्टता की आवश्यकता है तो मुझे बताएं।

public class NotesAudDisplay extends Activity implements OnPreparedListener, MediaController.MediaPlayerControl{ 
    private static final String TAG = "activity-NotesAudioDisplay"; 

    private String audioFilePath; 
    private String notesFileName; 
    private String mcfFileName; 
    private String key; 

    private SeekBar seekBarProgress; 

    private NotesElement notesElement = null; 
    private String notesTittle = "", notesHeading = ""; 
    private TextView heading_tv, playerStatus_tv; 
    private QuesBuilder qb = null; 

    private MediaPlayer mediaPlayer = null; 
    private MediaController mediaController; 

    private Drawable play_butt, pause_butt; 
    private ProgressDialog pd; 
    private Resources res = null; 

    private Handler handler = new Handler(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.audio_notesdisplay); 

     res = getResources(); 
     play_butt = res.getDrawable(R.drawable.play); 
     pause_butt = res.getDrawable(R.drawable.pause); 

     heading_tv = (TextView) findViewById(R.id.notesHeading_tv); 
     playerStatus_tv = (TextView) findViewById(R.id.playerStatus_tv); 

     Intent intent = getIntent(); 
     notesTittle = intent.getStringExtra("notesTittle"); 
     notesFileName = intent.getStringExtra("notesFileName"); 
     mcfFileName = intent.getStringExtra("mcfFileName"); 
     key = intent.getStringExtra("key"); 

     TextView tittle_tv = (TextView) findViewById(R.id.notesTittle_tv); 
     tittle_tv.setText(notesTittle); 

     NotesXMLParser nxp = new NotesXMLParser(this, notesFileName, 
       mcfFileName, key); 
     nxp.OpenXmlDocument(); 
     notesElement = nxp.getNotesContent(); 
     Log.d("TAG", "notesele:" + notesElement); 
     if (notesElement != null) { 
      notesHeading = notesElement.getHeading(); 
      heading_tv.setText(notesHeading); 

      QuesBuilderSet qbs = notesElement.getNotesStatement(); 
      ArrayList quesBuilder = qbs.getQuesBuilderSet(); 
      if (quesBuilder != null) { 
       Log.d(TAG, " quesBuilder len:" + quesBuilder.size()); 
       for (int i = 0; i < quesBuilder.size(); i++) { 
        qb = (QuesBuilder) quesBuilder.get(i); 
        if (qb.getType() == QuesBuilder.SPEECH) { 
         Log.d(TAG, " AUDIO"); 

         String file = qb.getQuesSpeech(); 
         File f = createTmpAudioFile(file); 

         boolean decrypt_result = false; 
         if (f != null) { 
          new LongOperation().execute(f); 
          Log.d(TAG,"****before long operation****"); 
          try { 
           Log.d(TAG,"****before thread operation****"); 
           Thread.sleep(3000); 
           Log.d(TAG,"****after thread operation****"); 
           setContent(); 

          } catch (Exception e) { 
           Log.d("InstructionForm", "Sleep thread fails"); 
          } 
          Log.d(TAG,"****after catch****"); 
         } else { 
          heading_tv.setText(notesHeading 
            + " Unable to play the audio."); 
         } 

        } else { 
         Log.d(TAG, " other:" + qb.getType()); 
        } 
       } 
      } 
     } 
    }// onCreate 

    public void setContent() { 
     mediaController = new MediaController(NotesAudDisplay.this); 
     mediaPlayer = new MediaPlayer(); 
     Log.d(TAG,"***GOING TO PREP STATE***"); 
     mediaPlayer.setOnPreparedListener(NotesAudDisplay.this); 
     Log.d(TAG,"***DONE WITH PREP STATE***"); 
     try { 
      mediaPlayer.setDataSource(audioFilePath); 
      mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
      mediaPlayer.prepareAsync(); 
      mediaPlayer.start(); 
      playerStatus_tv.setText("Playing.. . "); 
     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    private File createTmpAudioFile(String file) { 
     DBAdapter dba = new DBAdapter(NotesAudDisplay.this); 
     dba.open(); 
     String mobiDataPath = dba.get_mobidata_path(); 
     dba.close(); 
     audioFilePath = mobiDataPath + "/" + file; 
     Log.d(TAG, "tmp audio filePath:" + audioFilePath); 
     File f = null; 
     try { 
      f = new File(audioFilePath); 
      return f; 
     } catch (Exception e) { 
      f = null; 
      Log.d(TAG, " exception caught in creating audio file on sdcard"); 
     } 
     return null; 
    } 

    private class LongOperation extends AsyncTask<File, Void, Boolean> { 

     @Override 
     protected void onPreExecute() { 
      // TODO run small wheel 
      // show_wheel(); 
     } 

     @Override 
     protected Boolean doInBackground(File... arg0) { 
      DecryptZipReader dr = new DecryptZipReader(); 
      File f = arg0[0]; 
      Log.d(TAG, "*********copying start*********"); 
      boolean res = dr.getDecryptFileStream(NotesAudDisplay.this, 
        qb.getQuesSpeech(), mcfFileName, key, f); 
      return new Boolean(res); 
     } 

     @Override 
     protected void onPostExecute(Boolean result) { 
      // close_wheel(); 
      Log.d(TAG, "*********copying stop*********"); 

     } 

    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     if (mediaPlayer != null) { 
      mediaPlayer.release(); 
      mediaPlayer = null; 
     } 

    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     mediaPlayer.stop(); 
     mediaPlayer.release(); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     //the MediaController will hide after 3 seconds - tap the screen to make it appear again 
     mediaController.show(0); 
     return false; 
    } 

    //--MediaPlayerControl methods---------------------------------------------------- 
    public void start() { 
     mediaPlayer.start(); 
    } 

    public void pause() { 
     mediaPlayer.pause(); 
    } 

    public int getDuration() { 
     Log.d(TAG,"***duration:"+mediaPlayer.getDuration()); 
     return mediaPlayer.getDuration(); 
    } 

    public int getCurrentPosition() { 
     return mediaPlayer.getCurrentPosition(); 
    } 

    public void seekTo(int i) { 
     mediaPlayer.seekTo(i); 
    } 

    public boolean isPlaying() { 
     return mediaPlayer.isPlaying(); 
    } 

    public int getBufferPercentage() { 
     return 0; 
    } 

    public boolean canPause() { 
     return true; 
    } 

    public boolean canSeekBackward() { 
     return true; 
    } 

    public boolean canSeekForward() { 
     return true; 
    } 
    //-------------------------------------------------------------------------------- 

    public void onPrepared(MediaPlayer mediaPlayer) { 
     Log.d(TAG, "*********onPrepared*********"); 
     mediaController.setMediaPlayer(this); 
     mediaController.setAnchorView(findViewById(R.id.main_audio_view)); 

     handler.post(new Runnable() { 
     public void run() { 
      mediaController.setEnabled(true); 
      mediaController.show(0); 
     } 
     }); 
    } 
} 
+0

मैं जो भी पूछ रहा हूं उसे पुनर्विचार करता हूं ... जब आप इसे खेलते हैं तो अस्थायी रूप से ऑडियो फ़ाइल को संपीड़ित करें। ध्यान रखें कि सभी ऑडियो फाइलें निश्चित बिटरेट नहीं हैं, और तुरंत तलाश योग्य नहीं हैं। – Brad

+0

हाय ब्रैड। मैं उस पर विचार करता हूं। मेरे पास इसके लिए तंत्र है। मैंने अपना कोड बदल दिया है। मैं जांच रहा हूं कि फ़ाइल मौजूद है और एकत्रित डेटा 256 बाइट से अधिक है। तो वह हिस्सा एक समस्या नहीं है। मेरा सवाल है कि खोज बार को कैसे अपडेट करें। – maxwells

+0

ऑडियो फ़ाइल के लिए कुछ मेटाडेटा नहीं है जो बताता है कि ऑडियो की कुल लंबाई क्या है (समय में मेरा मतलब है, अंतरिक्ष नहीं)? आप इसे पढ़ सकते हैं, और सीधे अधिकतम मूल्य को अद्यतन करने की आवश्यकता के बिना फ़ाइल की लंबाई सीधे तलाशने के लिए डाल सकते हैं। – Genry

उत्तर

1

AFAIK, आप गूगल से ZipResource लाइब्रेरी का उपयोग निकालने के बिना एक ज़िप से एक FileDescriptor ले सकता है, यह केवल विस्तार संकुल के लिए है, लेकिन यह पूरी तरह से काम करता है अगर आप सिर्फ आइटम की दुकान है और यह सेक नहीं (ज़िप -r -n .mp3: .png: .txt भाग्य उत्पत्ति)।

फ़ाइलडिस्क्रिप्टर मीडियाप्लेयर के साथ उपयोग करने के लिए तैयार है, लेकिन अगर एन्क्रिप्टेड हो तो शायद दो वर्णक होने से आपको डिक्रिप्शन प्रवाह को अनुकूलित करने में मदद मिल सकती है।

public ZipResourceFile getExpansionFiles(Context context){ 


ZipResourceFile expansionFile = null; 
try { 
expansionFile = new ZipResourceFile(        
    Environment.getExternalStorageDirectory() + "/MyFolder" + "/" + "/MyFile" + ".zip"); 

} catch (FileNotFoundException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
}} 

तो का उपयोग करें: ZipResourceFile z = getExpansionFiles (mContext);

AssetFileDescriptor afd = z.getAssetFileDescriptor (mItem + "। Mp3");

मुझे उम्मीद है कि यह मदद करता है, वैसे भी, क्या आप सुनिश्चित हैं कि जब तक फ़ाइल पूरी तरह से डिक्रिप्ट नहीं हो जाती तब तक आप प्रतीक्षा नहीं करना चाहते हैं, और फिर इसे उड़ने वाले सिरदर्द के बारे में चिंता किए बिना खेलते हैं?

संबंधित मुद्दे