2010-07-19 12 views
8

Tôi cần ghi tệp âm thanh và video vào định dạng 3gp/mp4 trong cùng một tệp và cùng một lúc. Khi tôi chạy, tệp ứng dụng của tôi được tạo với videofile.3gp nhưng video không ghi vào thẻ SD trên trình mô phỏng. Bản ghi video trên trình giả lập không? Nếu tôi chạy mã này trên thiết bị được hỗ trợ Android, tôi có thấy các lỗi này không?lỗi ghi âm thanh và video trong android

Mã và lỗi dưới đây:

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

} 

tôi nhận được các lỗi sau đây.

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. 

Trả lời

11

API máy ảnh dường như yêu cầu nhiều nguồn được đặt, bao gồm cả âm thanh, video và mặt xem trước. Các mã sau đây hoàn chỉnh hơn:

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(); 
+2

Ngoài ra, hãy nhớ đặt quyền của bạn trong tệp kê khai để cho phép ghi âm, máy ảnh và lưu trữ tệp bên ngoài. Ngoài ra, đây là một câu hỏi StackOverflow khác mô tả chi tiết hơn về thiết lập ghi âm (có mặt). http://stackoverflow.com/questions/3225763/record-video-to-external-sd-card-on-android – ajaxlex

+0

videoKích thước phải là một trong các mảng được hỗ trợVideoSizes. Nếu không, ứng dụng sẽ bị lỗi. – tasomaniac

+0

recorder.setOutputFormat (MediaRecorder.OutputFormat.MPEG_4); // Chỉ cần nói .. – Li3ro

0

bản ghi phương tiện yêu cầu một số tính năng H/W, như bộ mã hóa video (h264, h263) ... giả lập có thể không hỗ trợ. chỉ cần thử trên thiết bị thực của bạn