2016-04-19 5 views
2

Я хочу записывать видео и аудио с помощью MediaRecorder.Выход MediaRecorder 0 байт файла

Это работа.

Но когда я проверяю выходной файл.

Я не могу воспроизвести выходной видеофайл.

Потому что,

выход Filesize является 0 byte.

также видео время 0 второй ..

Пожалуйста, проверьте мой код.

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

} 

Что такое проблема?

+0

Просто чтобы быть ясно, вы получите как 'start' и 'stop' в вашем logcat? – Knossos

+0

«Этот размер файла 0 байт» - как вы это определяете? Используя 'adb shell' или что-то еще? – CommonsWare

ответ

0

В else Пары вашего кода вы делаете:

recorder.stop();

initRecorder(); - >> "Проблема здесь"

Проблемы здесь: После вызова записи отделки методы initRecorder();

, который имеет следующую строку кода

recorder.setOutputFile(OUTPUT_FILE);

У него такой же путь к файлу. Переписывает старый файл новым пустым файлом.

Чтобы избежать этого используйте временную метку с именем файла, как это:

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

Теперь метод initRecorder() будет выглядеть следующим образом:

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 
    } 
Смежные вопросы