Как мне транслировать музыку из файла внутри зашифрованного zip, не распаковывая весь файл? - PullRequest
9 голосов
/ 24 декабря 2011

Я должен воспроизвести аудиофайл.Который находится в zip-файле, который присутствует в SDCard.И аудиофайл зашифрован.Поэтому, расшифровывая аудио, я получу данные во входном потоке.

Я не хочу разархивировать, потому что он потребляет место на диске.

Поскольку я исследовал, я не получил подсказок о том, каквоспроизводить аудио напрямую, если у меня есть стрим.Это возможно только по сети.Что не в этом случае.

Итак, я подумал о том, чтобы создать поток, который будет продолжать добавлять данные (байты) в файл.Когда это начнется, я звоню MediadPlayer, чтобы начать свою работу.

Медиаплеер работает нормально.Веселье начинается здесь: Предположим, аудиофайл за 6 минут - 5 МБ.Буферизация могла произойти для 2 МБ.В строке поиска я могу видеть максимальную продолжительность в течение 2 минут.Это совершенно верно.Когда буферизация все еще продолжается .. происходит, я хочу обновить время в строке поиска, и его длина (длина бара поиска) прямо пропорциональна для данного времени.Как мне это сделать.

Я пытался OnBufffering для этого, он не работал.Я думаю, на самом деле это для потокового аудио файла, если он воспроизводится по сети.

Пожалуйста, дайте мне простое решение, как это сделать?Не просите меня переопределить 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);
        }
      });
    }
}

1 Ответ

1 голос
/ 16 октября 2013

Afaik, вы можете взять FileDescriptor из zip без распаковки с помощью библиотеки ZipResource от Google, он предназначен только для пакетов расширения, но он отлично работает, если вы просто храните элементы и не сжимаете их (zip -r -n .mp3: .png: .txt источник судьбы).

FileDescriptor готов к использованию с MediaPlayer, но если он зашифрован, возможно, наличие двух дескрипторов может помочь вам оптимизировать поток расшифровки.

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");

Надеюсь, в любом случае это поможет, вы уверены, что не хотите ждать, пока файл полностью не расшифруется, а затем воспроизводить его, не беспокоясь обо всей этой головной боли на лету?

...