मुझे ऑडियो फ़ाइल खेलनी है। जो ज़िप फ़ाइल में है, जो एसडीकार्ड में मौजूद है। और ऑडियो फ़ाइल एन्क्रिप्टेड है। तो ऑडियो डिक्रिप्ट करते समय, मुझे इनपुटस्ट्रीम में डेटा मिल जाएगा।मैं पूरी फ़ाइल को डिकंप्रेस किए बिना एन्क्रिप्टेड ज़िप के अंदर फ़ाइल से संगीत कैसे स्ट्रीम करूं?
मैं अनजिप नहीं करना चाहता क्योंकि यह डिस्क पर स्थान खाता है।
जैसा कि मैंने जांच की है, मुझे स्ट्रीम नहीं होने पर ऑडियो को सीधे चलाने के तरीके पर संकेत नहीं मिला है। नेटवर्क पर यह केवल एकमात्र संभव है। जो इस मामले में नहीं है।
तो मैंने जो सोचा था वह एक धागा उत्पन्न करना है जो फ़ाइल में डेटा (बाइट्स) जोड़ना जारी रखेगा। जैसे ही यह शुरू होता है, मैं अपनी नौकरी शुरू करने के लिए 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);
}
});
}
}
मैं जो भी पूछ रहा हूं उसे पुनर्विचार करता हूं ... जब आप इसे खेलते हैं तो अस्थायी रूप से ऑडियो फ़ाइल को संपीड़ित करें। ध्यान रखें कि सभी ऑडियो फाइलें निश्चित बिटरेट नहीं हैं, और तुरंत तलाश योग्य नहीं हैं। – Brad
हाय ब्रैड। मैं उस पर विचार करता हूं। मेरे पास इसके लिए तंत्र है। मैंने अपना कोड बदल दिया है। मैं जांच रहा हूं कि फ़ाइल मौजूद है और एकत्रित डेटा 256 बाइट से अधिक है। तो वह हिस्सा एक समस्या नहीं है। मेरा सवाल है कि खोज बार को कैसे अपडेट करें। – maxwells
ऑडियो फ़ाइल के लिए कुछ मेटाडेटा नहीं है जो बताता है कि ऑडियो की कुल लंबाई क्या है (समय में मेरा मतलब है, अंतरिक्ष नहीं)? आप इसे पढ़ सकते हैं, और सीधे अधिकतम मूल्य को अद्यतन करने की आवश्यकता के बिना फ़ाइल की लंबाई सीधे तलाशने के लिए डाल सकते हैं। – Genry