2013-05-22 13 views
7

Ho un'app che prende il video dalla fotocamera o dalla galleria e lo converte in dati base64 e che i dati vengono inviati al server ma il problema è ogni volta che converto dati base64 non saranno dati corretti in videodata variabile. per questo ho usato il codice qui sotto:Come convertire i video in dati base64

FileInputStream objFileIS = null; 
try 
{ 
    System.out.println("file = >>>> <<<<<" + selectedImagePath); 
    objFileIS = new FileInputStream(selectedImagePath); 
} 
catch (FileNotFoundException e) 
{ 
    e.printStackTrace(); 
} 
ByteArrayOutputStream objByteArrayOS = new ByteArrayOutputStream(); 
byte[] byteBufferString = new byte[1024]; 
try 
{ 
    for (int readNum; (readNum = objFileIS.read(byteBufferString)) != -1;) 
    { 
     objByteArrayOS.write(byteBufferString, 0, readNum); 
     System.out.println("read " + readNum + " bytes,"); 
    } 
} 
catch (IOException e) 
{ 
    e.printStackTrace(); 
}      

videodata = Base64.encodeToString(byteBufferString, Base64.DEFAULT); 
Log.d("VideoData**> " , videodata); 

Si prega di renderlo corretto ...

risposta

5

Quando si codifica il byteBufferString, si codifica solo l'ultimo pezzo di dati letti. Dovresti codificare l'intero contenuto di ByteArrayOutputStream. È possibile farlo con il seguente codice:

videodata = Base64.encodeToString(objByteArrayOS.toByteArray(), Base64.DEFAULT); 

Tuttavia, c'è una possibilità che questo può gettare una OutOfMemoryError se le dimensioni del video è grande.

+0

Sì, come si parla ho ottenuto lo stesso errore OutOfMemoryError così che cosa sarà la soluzione per questo? –

+0

Dai un'occhiata a questa [domanda] (http://stackoverflow.com/q/11775036/1321873) – Rajesh

1

mi risolverlo in questo modo:

@Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

     Log.d("Imagen este ", String.valueOf(data)); 
     if(data!=null) { 
      switch (requestCode) { 
case SELECT_VIDEO: 
        Uri selectedVideoUri = data.getData(); 
        String[] projection = {MediaStore.Video.Media.DATA, MediaStore.Video.Media.SIZE, MediaStore.Video.Media.DURATION}; 
        Cursor cursor = managedQuery(selectedVideoUri, projection, null, null, null); 

        cursor.moveToFirst(); 
        String filePath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA)); 
        Log.d("File Name:",filePath); 

        Bitmap thumb = ThumbnailUtils.createVideoThumbnail(filePath, MediaStore.Video.Thumbnails.MINI_KIND); 
        // Setting the thumbnail of the video in to the image view 
        msImage.setImageBitmap(thumb); 
        InputStream inputStream = null; 
// Converting the video in to the bytes 
        try 
        { 
         inputStream = getContentResolver().openInputStream(selectedVideoUri); 
        } 
        catch (FileNotFoundException e) 
        { 
         e.printStackTrace(); 
        } 
        int bufferSize = 1024; 
        byte[] buffer = new byte[bufferSize]; 
        byteBuffer = new ByteArrayOutputStream(); 
        int len = 0; 
        try 
        { 
         while ((len = inputStream.read(buffer)) != -1) 
         { 
          byteBuffer.write(buffer, 0, len); 
         } 
        } 
        catch (IOException e) 
        { 
         e.printStackTrace(); 
        } 
        System.out.println("converted!"); 

        String videoData=""; 
        //Converting bytes into base64 
        videoData = Base64.encodeToString(byteBuffer.toByteArray(), Base64.DEFAULT); 
        Log.d("VideoData**> " , videoData); 

        String sinSaltoFinal2 = videoData.trim(); 
        String sinsinSalto2 = sinSaltoFinal2.replaceAll("\n", ""); 
        Log.d("VideoData**> " , sinsinSalto2); 

        baseVideo = sinsinSalto2; 

videoData ha le base64 del video .. Spero che servono, ho lavorato perfetto

+0

Questo funzionerà per i piccoli video. Incontrerai spesso 'OutOfMemoryError' con l'aumentare delle dimensioni del tuo video. – CommonsWare

Problemi correlati