2016-04-19 1 views
2

Je souhaite enregistrer de la vidéo et de l'audio en utilisant MediaRecorder.Sortie MediaRecorder Fichier 0 octet

C'est du travail. Mais quand je vérifie le fichier de sortie.

Je ne peux pas lire le fichier vidéo de sortie.

Parce que,

taille du fichier de sortie est 0 byte.

également la vidéo en temps est 0 secondes ..

S'il vous plaît vérifier mon code.

public class Talk extends Activity implements SurfaceHolder.Callback{ 

Context context; 


SurfaceView sfv_Preview; 
private SurfaceHolder holder; 
private MediaRecorder recorder = null; 
boolean recording = false; 

private static final String OUTPUT_FILE = "/sdcard/videooutput.mp4"; 
private static final String OUTPUT_FILE_NAME = "videooutput.mp4"; 
private static final int RECORDING_TIME = 10000; 

//Uri fileUri; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_talk); 


    recorder = new MediaRecorder(); 
    initRecorder(); 

    sfv_Preview = (SurfaceView) findViewById(R.id.sfv_Preview); 


    holder = sfv_Preview.getHolder(); 
    holder.addCallback(this); 
    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

    context = this; 


    ((ImageButton)findViewById(R.id.ibt_Record)).setOnTouchListener(new OnTouchListener(){ 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      if (MotionEvent.ACTION_DOWN == event.getAction()) { 
       recorder.start(); 
       Log.d("recod", "start"); 
      } 
      else if (MotionEvent.ACTION_UP == event.getAction() || event.getAction() == MotionEvent.ACTION_CANCEL) { 
       Log.d("recod", "stop"); 
       recorder.stop(); 
       initRecorder(); 
       prepareRecorder(); 
      } 
      return false; 
     } 
    }); 

} 


@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 
    prepareRecorder(); 
} 

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, 
     int height) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 
    if (recording) { 
     recorder.stop(); 
     recording = false; 
    } 
    recorder.release(); 
    finish(); 
} 

private void initRecorder() { 
    recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); 
    recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); 

    CamcorderProfile cpHigh = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH); 
    recorder.setProfile(cpHigh); 
    recorder.setOutputFile(OUTPUT_FILE); 

    recorder.setMaxDuration(RECORDING_TIME); 
    recorder.setMaxFileSize(10485760); // Approximately 5 megabytes 
} 

private void prepareRecorder() { 
    recorder.setPreviewDisplay(holder.getSurface()); 
    //recorder.setOrientationHint(90); 

    try { 
     recorder.prepare(); 
     //finish(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
     //finish(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     //finish(); 
    } 
} 

} 

Qu'est-ce qu'un problème?

+0

Pour être clair, vous obtenez à la fois 'start' et 'stop' dans votre logcat? – Knossos

+0

"Cette taille de fichier est 0 octet" - comment déterminez-vous cela? En utilisant 'shell adb', ou autre chose? – CommonsWare

Répondre

0

Dans le else pare de votre code que vous faites:

recorder.stop();

initRecorder(); - >> "Le problème est ici"

Le problème est ici: Après appel d'enregistrement d'arrivée à la méthode initRecorder(); Code

recorder.setOutputFile(OUTPUT_FILE);

Il a le même chemin de fichier. Qui réécrit l'ancien fichier par un nouveau fichier vide.

Pour éviter cet horodatage d'utilisation avec le nom de fichier comme ceci:

private File getVideoFile() { 
    File videoDir = new File(Environment.getExternalStoragePublicDirectory(
      Environment.DIRECTORY_PICTURES), "VideoList"); 
    // Create parent directory 
    if (!videoDir.exists()) { 
     if (!videoDir.mkdirs()) { 
      Log.d("ZZZ", "failed to create directory"); 
      return null; 
     } 
    } 

    // Create a video file 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    File videoFile; 
    videoFile = new File(videoDir.getPath() + File.separator + 
      "REC_" + timeStamp + ".mp4"); 
    return videoFile; 
} 

maintenant méthode initRecorder() ressemblerait à ceci:

private void initRecorder() { 
     recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); 
     recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); 

     CamcorderProfile cpHigh = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH); 
     recorder.setProfile(cpHigh); 
     // recorder.setOutputFile(OUTPUT_FILE);//OLD 
     recorder.setOutputFile(getVideoFile());// NEW 

     recorder.setMaxDuration(RECORDING_TIME); 
     recorder.setMaxFileSize(10485760); // Approximately 5 megabytes 
    }