【问题标题】:audio and video recording errors in androidandroid中的音频和视频录制错误
【发布时间】:2010-07-19 13:40:34
【问题描述】:

我需要在同一个文件中同时录制 3gp/mp4 格式的音频和视频文件。 当我运行时,我的应用程序文件是用videofile.3gp 创建的,但视频没有录制到模拟器上的 SD 卡中。模拟器上能录视频吗?如果我在支持 android 的设备上运行此代码,我会看到这些错误吗?

以下代码和错误:

    package com.video;
/*
 * 
 * @copy Rights
 * audio.java
 * sample code for Eminosoft Developerworks Article
 * Android developent Team
 * www.eminosoft.cm
 * 
 */


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.provider.Settings;
import android.util.Log;
import android.view.View;
import android.widget.Button;


public class video extends Activity {

    public MediaRecorder mrec = null;
    private Button startRecording = null;
    private Button stopRecording = null;
    private static final String TAG = "SoundRecordingDemo";
    File audiofile;
    File video;
    private MediaPlayer mMediaPlayer;



    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mrec = new MediaRecorder();
        mMediaPlayer = new MediaPlayer();

        Log.i(TAG , "Video starting");
        startRecording = (Button)findViewById(R.id.startrecording);
        stopRecording = (Button)findViewById(R.id.stoprecording);
        startRecording.setOnClickListener(new View.OnClickListener(){
        public void onClick(View v) {
           try
           {    
               mMediaPlayer=new MediaPlayer();
               Context appContext = getApplicationContext();
               startRecording.setEnabled(false);
               stopRecording.setEnabled(true);
               stopRecording.requestFocus();
               startRecording();
           }catch (Exception ee)
           {
               Log.e(TAG,"Caught io exception " + ee.getMessage());
           }

          }
        });

        stopRecording.setOnClickListener(new View.OnClickListener(){
        public void onClick(View v) {
              startRecording.setEnabled(true);
              stopRecording.setEnabled(false);
              startRecording.requestFocus();
              stopRecording();
              processaudiofile();
          }

        });

       stopRecording.setEnabled(false);
       startRecording.setEnabled(true);

    }
    protected void processaudiofile() {
        ContentValues values = new ContentValues(4);
        long current = System.currentTimeMillis();
        values.put(MediaStore.Video.Media.TITLE, "video"+video.getName());
        values.put(MediaStore.Video.Media.DATE_ADDED, (int)(current/1000));
        values.put(MediaStore.Video.Media.MIME_TYPE, "video/3gpp");
        values.put(MediaStore.Video.Media.DATA, video.getAbsolutePath());
        ContentResolver contentResolver = getContentResolver();
        Uri base=MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
        Uri newUri = contentResolver.insert(base, values);
       // this does not always seem to work cleanly....
        //sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,newUri ));
      }

    protected void startRecording() throws IOException 
    {

        // Configure the input sources
        mrec.setAudioSource(MediaRecorder.AudioSource.MIC);
        mrec.setVideoSource(MediaRecorder.VideoSource.CAMERA);

        // Set the output format
        mrec.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        mrec.setVideoFrameRate(15);

        // Specify the audio and video encoding        
        mrec.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        mrec.setVideoEncoder(MediaRecorder.VideoEncoder.H264);

        //mrec.setMaxDuration(20000); // length of video in MS
        //mrec.setVideoSize(320, 240);


        // Specify the output file
        //mrec.setOutputFile("/sdcard/myoutputfile.mp4");

        // Prepare to record
        //mrec.prepare();

        //mrec.start();

      //mrec.setOutputFile(video.getPath());
      //mrec.setOutputFile(/sdcard/yousuck2.3gp);
     // mRecorder.setOutputFile("/sdcard/yousuck2.3gp");
    if (video == null) {
              File sampleDir = Environment.getExternalStorageDirectory();
            try { 
                  video = File.createTempFile("videofile", ".3gp", sampleDir);
              } 
              catch (IOException e)
              {
                  Log.e(TAG,"sdcard access error");
                  return;
              }
      }

     mrec.setOutputFile(video.getAbsolutePath());

      mrec.prepare();
      mrec.start();
    }

    protected void stopRecording() {
        mrec.stop();
        mrec.release();
      }

}

我收到以下错误。

ERROR/AndroidRuntime(16055): ERROR: thread attach failed

ERROR/audio_input(31): unsupported parameter: x-pvmf/media-input-node/cap-config-interface;valtype=key_specific_value

ERROR/audio_input(31): VerifyAndSetParameter failed



 ERROR/CameraInput(31): Unsupported parameter(x-pvmf/media-input-node/cap-config-interface;valtype=key_specific_value)


 ERROR/CameraInput(31): VerifiyAndSetParameter failed on parameter #0


 ERROR/PVOMXEncNode(31): PVMFOMXEncNode-Audio_AMRNB::DoPrepare(): Got Component OMX.PV.amrencnb handle 


 ERROR/PVOMXEncNode(31): PVMFOMXEncNode-Video_AVC::DoPrepare(): Cannot get component OMX.PV.avcenc handle, try another component if available



 ERROR/MediaPlayerService(31):   error: -2


 ERROR/MediaPlayer(31): Unable to to create media player



 ERROR/CameraService(31): Failed to load CameraService sounds.


 ERROR/MediaPlayerService(31):   error: -2

    ERROR/MediaPlayer(31): Unable to to create media player

 ERROR/CameraService(31): Failed to load CameraService sounds.

     ERROR/CameraInput(31): No surface is available for display.

 ERROR/AuthorDriver(31): Command 13 completed with error -1

 ERROR/SoundRecordingDemo(15961): Caught io exception prepare failed.

【问题讨论】:

    标签: android video-capture audio-recording


    【解决方案1】:

    相机 API 似乎需要设置许多源,包括音频、视频和预览表面。下面的代码比较完整:

    recorder = new MediaRecorder(); 
    recorder.setPreviewDisplay(previewSurface); 
    
    recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); 
    recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); 
    
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
    recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); 
    
    recorder.setMaxDuration(1000 * 10); 
    recorder.setOnInfoListener(self); 
    
    recorder.setVideoSize(200, 200); 
    recorder.setVideoFrameRate(15);
    
    recorder.setOutputFile("/sdcard/test.mp4");
    
    recorder.prepare(); 
    recorder.start();
    

    【讨论】:

    • 另外,请记住在清单中设置您的权限,以允许录音、摄像头和外部文件存储。另外,这是另一个 StackOverflow 问题,它更详细地描述了记录设置(带有表面)。 stackoverflow.com/questions/3225763/…
    • videoSize 应该是 supportedVideoSizes 数组之一。否则应用会崩溃。
    • 我在片段中进行此操作,您知道如何设置 previewSurface 吗?
    【解决方案2】:

    媒体记录需要一些硬件功能,例如视频编码器(h264,h263)...模拟器可能不支持。只需在您的真实设备上尝试

    【讨论】:

      猜你喜欢
      • 2014-08-02
      • 1970-01-01
      • 1970-01-01
      • 2012-08-08
      • 1970-01-01
      • 2012-05-08
      • 2013-04-14
      • 2016-08-07
      • 1970-01-01
      相关资源
      最近更新 更多