2011-12-24 19 views
8

Tengo que reproducir el archivo de audio. Que está en archivo zip, que es el presente en sdcard. Y el archivo de audio está encriptado. Entonces, mientras descifro el audio, obtendré los datos en la ruta de entrada.¿Cómo puedo transmitir música desde un archivo dentro de un archivo zip cifrado sin descomprimir todo el archivo?

No quiero descomprimir porque ocupa espacio en el disco.

Como he investigado, no tengo pistas sobre cómo reproducir audio directamente si tengo transmisión. Es solo posible a través de la red. Que no es en este caso

Entonces, lo que pensé es engendrar un hilo que seguirá anexando datos (bytes) al archivo. Cuando esto comience, llamo al MediadPlayer para comenzar su trabajo.

El reproductor de medios funciona bien. La diversión comienza aquí: supongamos que si el archivo de audio es de 6 min a 5 MB. El almacenamiento en búfer puede haber ocurrido para 2 MB. En la barra de búsqueda puedo ver durante 2 minutos como mi duración máxima. Esto está perfectamente bien. Cuando el almacenamiento en búfer todavía continúa ... sucediendo, quiero actualizar el tiempo en la barra de búsqueda y su longitud (longitud de la barra de búsqueda) es directamente proporcional para el tiempo dado. ¿Cómo hago esto?

Probé OnBufffering para esto, no funcionó. Supongo que en realidad es para la transmisión de archivos de audio, si se reproduce en una red.

Por favor, dame una solución simple, ¿cómo hacer esto? No me pidas que anule la clase MediaPlayer y trabajes en ella.

Cualquier ayuda es apreciada. Avíseme si necesita más claridad sobre esto.

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

Me gustaría reconsiderar lo que me está preguntando ... Descomprimir el archivo de audio temporalmente mientras lo reproduce. Tenga en cuenta que no todos los archivos de audio tienen una velocidad de bits fija y no se pueden buscar inmediatamente. – Brad

+0

Hola, brad. Yo considero eso. Tengo un mecanismo para eso. He alterado mi código. Estoy comprobando si el archivo existe y los datos recopilados tienen más de 256 bytes. Entonces esa parte no es un problema. Mi pregunta es cómo actualizar la barra de búsqueda. – maxwells

+0

¿No hay algunos metadatos para el archivo de audio que indiquen cuál es la duración total del audio (es decir, no el espacio)? Puede leer eso y poner la longitud del archivo directamente en la barra de búsqueda, sin necesidad de actualizar el valor máximo constantemente. – Genry

Respuesta

1

Que yo sepa, usted podría tomar un FileDescriptor de una postal sin necesidad de extraer el uso de la Biblioteca ZipResource de Google, que está destinada únicamente a los paquetes de expansión, pero funciona perfectamente si sólo almacenar los artículos y no comprime (zip -r -n .mp3: .png: origen de destino de .txt).

FileDescriptor está listo para usar con MediaPlayer, pero si está encriptado puede tener dos descriptores que podrían ayudarlo a optimizar el flujo de desencriptado.

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

a continuación, utilizar: ZipResourceFile z = getExpansionFiles (mContext);

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

Espero que ayude, de todos modos, ¿está seguro de que no quiere esperar hasta que el archivo esté completamente descifrado, y luego jugar sin preocuparse por todo este dolor de cabeza sobre la marcha?

Cuestiones relacionadas