2013-05-22 11 views
7

Mam aplikację, która pobiera wideo z kamery lub galerii i konwertuje je na dane base64 i dane są wysyłane na serwer, ale problem jest, gdy tylko konwertuję dane base64, to nie będą poprawne dane w videodacie zmienna. Użyłem do tego poniżej kodu:Jak przekonwertować wideo na dane 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); 

proszę zrobić to poprawne ...

Odpowiedz

5

Podczas kodowania byteBufferString, jesteś kodowania tylko ostatni fragment danych odczytanych. Powinieneś zakodować całą zawartość ByteArrayOutputStream. Można to zrobić za pomocą następującego kodu:

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

Jednak jest szansa, że ​​może to rzucić OutOfMemoryError jeśli rozmiar wideo jest duży.

+0

Tak jak wspomniałeś mam ten sam błąd co tak OutOfMemoryError będzie rozwiązaniem dla niego? –

+0

Spójrz na to [pytanie] (http://stackoverflow.com/q/11775036/1321873) – Rajesh

1

go rozwiązać tak:

@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; 

wizyjne ma base64 z filmu .. Mam nadzieję, że służyć, pracowałem idealny

+0

To będzie działać dla małych filmów. Częściej napotkasz komunikat "OutOfMemoryError", ponieważ rozmiar twojego wideo rośnie. – CommonsWare

Powiązane problemy