2012-06-27 1 views
1

Я пытаюсь создать собственное приложение для записи видео и следовать учебному курсу в Интернете. Однако у меня возникает проблема, что экран становится черным после нажатия кнопки запуска, и ничего больше не произошло. После нажатия кнопки «Стоп» я проверил каталог, в который я помещал выходное видео. Он есть, но размер составляет 0 КБ.Экран переходит в черный цвет после запуска видеозаписи - приложение для Android

Я использовал SurfaceView и вот XML макет:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
<TextView 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello" 
    /> 
<Button 
android:id="@+id/start" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="- Start Camera Preview -" 
    /> 
<Button 
android:id="@+id/stop" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="- Stop Camera Preview -" 
    /> 
<SurfaceView 
android:id="@+id/surfaceview" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    /> 
</LinearLayout> 

А вот краткий код для записи видео:

public class CamTestActivity extends Activity implements SurfaceHolder.Callback{ 
    private static final String TAG = "Camera-Tutorial"; 

    private SurfaceView surfaceView; 
    private SurfaceHolder surfaceHolder; 
    private Camera camera; 
    private boolean previewRunning; 
    private int VIDEO_TYPE = 3; 
    private int intVideoIndex = 1; 

    private MediaRecorder mediaRecorder; 
    private final int maxDurationInMs = 20000; 
    private final int videoFramesPerSecond = 20; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); 

     setContentView(R.layout.videopreview); 

     // setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

     surfaceView = (SurfaceView) findViewById(R.id.surfaceview); 
     surfaceHolder = surfaceView.getHolder(); 
     surfaceHolder.addCallback(this);  
     Button start_video = (Button) findViewById(R.id.start); 
     Button stop_video = (Button) findViewById(R.id.stop); 


     stop_video.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mediaRecorder.stop(); 
       camera.lock(); 
      } 
     }); 

     start_video.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       try { 
        camera.unlock();     
        mediaRecorder = new MediaRecorder(); 
        mediaRecorder.setCamera(camera);    
        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
        mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 

        mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
               mediaRecorder.setOutputFile(GetOutputMediaFileDir(VIDEO_TYPE,intVideoIndex)); 
        mediaRecorder.setVideoFrameRate(1); 
        mediaRecorder.setVideoEncoder(MediaRecorder.AudioEncoder.AAC); 
        mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); 

        mediaRecorder.prepare(); 
        mediaRecorder.start(); 
       } catch (IllegalStateException e) { 
        Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show(); 
        // Log.e(TAG,e.getMessage()); 
       // e.printStackTrace(); 

       } catch (IOException e) { 
        Log.e(TAG,e.getMessage()); 
        // e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     camera = Camera.open(); 
     if (camera != null){ 
      Camera.Parameters params = camera.getParameters(); 
      camera.setParameters(params); 
     } 
     else { 
      Toast.makeText(getApplicationContext(), "Camera not available!", Toast.LENGTH_LONG).show(); 
      finish(); 
     } 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
     if (previewRunning){ 
      camera.stopPreview(); 
     } 
     Camera.Parameters p = camera.getParameters(); 
     p.setPreviewSize(width, height); 
     camera.setParameters(p); 

     try { 
      camera.setPreviewDisplay(holder); 
      camera.startPreview(); 
      previewRunning = true; 
     } 
     catch (IOException e) { 
      Log.e(TAG,e.getMessage()); 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     camera.stopPreview(); 
     previewRunning = false; 
     camera.release(); 
    } 
public static String GetOutputMediaFileDir(int fileType, int index){ 

     String fileDir=null; 

      String strIndex = Integer.toString(index); 
      if(fileType == 1) 
      { 
     File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
       Environment.DIRECTORY_MUSIC), "Audio"); 

     if (! mediaStorageDir.exists()){ 
      if (! mediaStorageDir.mkdirs()){ 

       return null; 
      } 
     } 

      fileDir = mediaStorageDir.getPath() + File.separator + 
        "AUDIO_"+ strIndex + ".mp4"; 
      } 
      if(fileType == 2) 
      { 
       File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
         Environment.DIRECTORY_PICTURES), "Image"); 

       if (! mediaStorageDir.exists()){ 
        if (! mediaStorageDir.mkdirs()){ 

         return null; 
        } 
       } 

        fileDir = mediaStorageDir.getPath() + File.separator + 
          "IMAGE_"+ strIndex + ".jpeg"; 
      } 

      if(fileType == 3) 
      { 
       File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
         Environment.DIRECTORY_MOVIES), "Video"); 

       if (! mediaStorageDir.exists()){ 
        if (! mediaStorageDir.mkdirs()){ 

         return null; 
        } 
       } 

        fileDir = mediaStorageDir.getPath() + File.separator + 
          "VIDEO_"+ strIndex + ".mp4"; 
      } 


     return fileDir; 

     } 

} 

Любые идеи о том, как решить эту проблему? Заранее большое спасибо.

Изменения, которые решают эту проблему:

Во-первых я установить видео кодер к аудио кодер, то это должно быть изменено;

Во-вторых mediaRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface()); должны быть добавлены до mediaRecorder.prepare()

Затем он работает должным образом.

ответ

0

Я испытал эту проблему на устройстве HTC Incredible, но он отлично работал на 8 других, которые я тестировал. Вот столб «решили», что вопрос:

https://stackoverflow.com/a/9903357/1426565

Я сужен фактическое исправление до определенной строки:

recorder.setVideoSize(width, height); 

В/битрейте настройки частоты кадров не имело отношения в исправлении, и Я не уверен, что использование DEFAULT для источников, формата вывода и кодировщиков ничего не изменит, но если вы подумаете об этом, это не должно повлиять на него вообще.

Это другие настройки я использую с ним (убедитесь, что размер установлен перед любым энкодером):

recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
    recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 

    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); 
    recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); 

    recorder.setPReviewDisplay(surfaceView.getHolder().getSurface()) 

Также обратите внимание, что в тестировании вчера на ICS, мы столкнулись с проблемой, где setFrameRate не поддерживается , а также setVideoSize не поддерживается. Таким образом, в исправлении, которое я собираюсь сделать, я просто собираюсь окружить setVideoSize блоком try/catch, удалить setFrameRate и надеяться, что Бог это исправит. Если нет, мне, вероятно, придется просто исключить его на некоторых устройствах.

+0

Большое спасибо за ответы! Я заметил, что я установил видеокодер в аудиокодер. Однако после того, как я изменил кодировщик на h264 и частоту кадров до 24, приложение выйдет из строя после нажатия кнопки запуска. Однако, если я устанавливаю кодировщик как H263, а частота кадров равна 1, тогда экран замерзает после нажатия кнопки запуска, и ничего больше не происходит. Видеовыход находится в каталоге, но все еще 0 КБ. Я полностью смутился этим. Любая помощь приветствуется. – Iam619

+0

Я буквально все еще тестирую это, когда мы говорим, но я думаю, что нашел конкретную строку, которая устраняет нашу проблему: «recorder.setVideoSize (getMaxSupportedVideoSize(). Width, getMaxSupportedVideoSize(). Height); абсолютно необходимо. Я удалил setVideoFrameRate (поскольку устройство управляет им на основе света в любом случае) и setVideoEncodingBitRate (так же, как это настраивается устройством), и теперь он работает правильно на всех устройствах, на которых я его пытаюсь. Если setVideoSize отсутствует, он терпит неудачу и дает нам проблему, с которой мы сталкиваемся – Guardanis

+0

Обновленный основной пост с дополнительной информацией – Guardanis

Смежные вопросы