2014-12-15 1 views
0

Я захватил видео с помощью моей пользовательского видео активности и кодируемого его в base64, используя этот методсохранить массив байт как .mp4 файл и воспроизвести его в VideoView андроида

private String encodeVideoTobase64(Uri uri , int index) 
{ 
    String videodata  = ""; 
    String[] filePathColumn = { MediaStore.Video.Media.DATA }; 

    Cursor cursor = this.getContentResolver().query(uri,filePathColumn, null, null, null); 
    String videoPath; 
    try{ 
     cursor.moveToFirst(); 

     int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
     videoPath  = cursor.getString(columnIndex); 
    } 
    catch(Exception e) 
    { 
     videoPath = PathsOfVideos.get(index); 
    } 
    try { 
     @SuppressWarnings("resource") 
     FileInputStream v_input = new FileInputStream(videoPath); 
     ByteArrayOutputStream objByteArrayOS = new ByteArrayOutputStream(); 
     byte[] byteBufferString = new byte[1024]; 
     for (int readNum; (readNum = v_input.read(byteBufferString)) != -1;) 
     { 
      objByteArrayOS.write(byteBufferString, 0, readNum); 
      System.out.println("read " + readNum + " bytes,"); 
     } 

     videodata = MyBase64.encodeBytes(byteBufferString);//Base64.encodeToString(objByteArrayOS.toByteArray(), Base64.DEFAULT); 

    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    return videodata; 
} 

Затем я послал закодированное видео на сервер ,

Теперь я хочу получить строку base64 видео, декодировать его и отобразить на видео. Я попытался преобразовать строку base64 в массив байтов, а затем сохранить его на мобильном телефоне, а затем отобразить его в виде видео с помощью этого кода.

protected void showInstVideo(int pos) { 
    // TODO Auto-generated method stub 
    final Dialog dialog = new Dialog(this); 
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    dialog.setContentView(R.layout.dialog_video); 

    //Decode String To Video With mig Base64. 
    String encodedString = r.getRecipeInstructions().get(pos).getVideoStr(); 
    if (encodedString.compareTo("")!=0) { 
     byte[] decodedBytes = MiGBase64.decodeFast(encodedString.getBytes()); 

     try { 
      Date date=new Date(); 
      String filename="/rec"+ date.toString().replace(" ", "_").replace(":", "_")+".mp4"; 
      String root = Environment.getExternalStorageDirectory().toString(); 
      File myDir = new File(root+"/MyAppName"); 
      if (!myDir.exists()) 
       myDir.mkdir(); 
      File file = new File (myDir, filename); 

      FileOutputStream out = new FileOutputStream(file); 
      out.write(decodedBytes); 
      out.close(); 

      VideoView instvideo  = (VideoView) dialog.findViewById(R.id.vvdetails); 
      MediaController mediaController = new MediaController(this); 
      mediaController.setAnchorView(instvideo); 
      Uri video = Uri.parse(file.getPath()); 
      instvideo.setVideoURI(video); 

      if (video != null) 
      { 
       dialog.show(); 
       instvideo.start(); 
      } 
     } catch (Exception e) { 
      // TODO: handle exception 
      Log.e("Error", e.toString()); 
     } 
    } 


} 

Но папка/MyAppName не создается так видео не сохраняется, и, конечно, в результате я не могу воспроизвести видео.

Не могли бы вы помочь мне найти то, что мне не хватает? Заранее спасибо

Примечание: код работает правильно и не улавливает любое исключение

+0

добавляемые Вы <использует-разрешение андроида: имя = "android.permission.WRITE_EXTERNAL_STORAGE" /> разрешение –

+0

Да это разрешение существует. Но там что-то странное, я обнаружил, что ВСЕ созданные папки появляются внезапно. Я не знаю. В чем причина того, что они не появлялись мгновенно. У вас есть идея? –

+1

Да. Операции с файлами занимают некоторое время. Вам нужно использовать AsynchTask. Для этого .. И проверьте, что onPostExecute завершено. –

ответ

1

Вместо mkdir() вы можете также использовать mkdirs(). mkdirs() создаст все каталоги до последнего каталога в указанном пути.

Заменить этот код:

File myDir = new File(root + File.separator + "MyAppName"); 
myDir.mkdirs(); 
File file = new File (myDir.getAbsolutePath(), filename); 

С:

File myDir = new File(root+"/MyAppName"); 
if (!myDir.exists()) 
    myDir.mkdir(); 
File file = new File (myDir, filename); 
+0

Я нашел ВСЕ созданные папки неожиданно появляются. Я не знаю. В чем причина того, что они не появлялись мгновенно. У вас есть идея? –