2013-07-23 87 views
11

Dưới đây là cấu trúc của mã làm việc của tôi để ghi lại video và âm thanh:Sử dụng android MediaRecorder

Câu hỏi: 1) Tại sao CamcorderProfile cần thiết? setProfile(...) xuất hiện để đặt thứ nguyên thành bất kỳ thứ gì QUALITY_HIGH cung cấp, nhưng sau đó tôi đặt thứ nguyên tôi muốn với setVideoSize(...), sẽ ghi đè thứ nguyên này. Tuy nhiên, khi tôi xóa hai dòng CamcorderProfile, ứng dụng gặp sự cố tại setVideoSize(...) với LogCat E/MediaRecorder(19526): setVideoSize called in an invalid state: 2.

2) Làm thế nào để không ghi lại âm thanh? Tài liệu nêu rõ rằng nếu setAudioSource(...) không được gọi, sẽ không có bản âm thanh. Tuy nhiên, khi tôi xóa dòng đó, ứng dụng gặp sự cố tại setProfile(...) với LogCat E/MediaRecorder(19946): try to set the audio encoder without setting the audio source first.

3) Nếu tôi xóa cả hai dòng CamcorderProfile và đường dây setAudioSource(...), nó đổ vỡ như trong 1).

4) Tôi cũng đã thử thêm dòng

recorder.setOutputFormat(OutputFormat.DEFAULT); 

thay vì các dòng CamcorderProfile. Nhưng giờ nó bị treo ở số perpare(). Nếu setAudioSource(...) được gọi là LogCat là: E/MediaRecorder(20737): audio source is set, but audio encoder is not set nếu nó không được gọi là LogCat là: E/MediaRecorder(20544): video source is set, but video encoder is not set

Tôi đã nhìn allover internet và tôi không thể tìm thấy một ví dụ tốt về cách chính xác để thiết lập các MediaRecorder. Here nó ngụ ý sau khi API 8 bạn nên sử dụng lớp CamcorderProfile, nhưng có vẻ như với tôi rằng nó đang gây ra vấn đề.

Mọi trợ giúp sẽ tuyệt vời! Cảm ơn!

Mã (mà hoạt động khi chạy vì nó là dưới đây):

recorder = new MediaRecorder(); 
recorder.setCamera(<<camera>>); 
recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); 
recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); 

CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH); 
recorder.setProfile(profile); 

recorder.setOutputFile(<<Path String>>); 
recorder.setVideoSize(<<Width>>, <<Height>>); 

recorder.setPreviewDisplay(<<Surface>>); 

recorder.setOrientationHint(0); 
recorder.setMaxDuration(10000); 
recorder.setOnInfoListener(this); 

try 
{ 
    recorder.prepare(); 
    recorder.start(); 
} catch ... 

Trả lời

15

Tôi không có nhiều kinh nghiệm với MediaRecorder nhưng tôi đã đọc một số chủ đề liên quan và tôi sẽ cố gắng trả lời câu hỏi của bạn:

1, 3 và 4) Máy quay phimKhông chỉ đặt độ phân giải, nó còn đặt định dạng đầu ra và bộ mã hóa (cho cả âm thanh và video). Bạn đang gặp lỗi vì có thể bạn cần sử dụng setOutputFormat trước khi gọi setVideoSize và bạn phải gọi setVideoEncodersetAudioEncoder sau đó, nếu bạn không muốn sử dụng CamcorderProfile. [Theo này answer]

2) Một lần nữa, CamcorderProfile cũng đặt thuộc tính âm thanh (như Codec, bitrate, samplerate, ...), do đó bạn cần phải thiết lập một nguồn âm thanh trước khi gọi nó, đó là lý do tại sao ứng dụng bị lỗi. Nếu bạn không muốn ghi lại âm thanh thử đoạn code sau: (Tôi đã không kiểm tra nó vì vậy tôi không thực sự biết nếu nó hoạt động, nhưng tôi khá chắc chắn nó)

recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); 
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
recorder.setVideoSize(WIDTH, HEIGHT); 
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT); 
recorder.setOutputFile(PATH); 
recorder.setPreviewDisplay(SURFACE); 

recorder.prepare(); 
recorder.start(); 

Cũng lưu ý nếu bạn không muốn sử dụng CamcorderProfile (nghĩa là bạn chỉ muốn ghi lại âm thanh hoặc video), bạn có thể phải thiết lập các tham số bổ sung để đảm bảo bạn có chất lượng bạn muốn. Hãy xem mã ví dụ sau:

recorder = new MediaRecorder(); 
recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); 
recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); 

// Following code does the same as getting a CamcorderProfile (but customizable) 
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
// Video Settings 
recorder.setVideoSize(WIDTH, HEIGHT); 
recorder.setVideoFrameRate(FRAME_RATE); 
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT); 
recorder.setVideoEncodingBitRate(VIDEO_BITRATE); 
// Audio Settings 
recorder.setAudioChannels(AUDIO_CHANNELS); 
recorder.setAudioSamplingRate(SAMPLE_RATE); 
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); 
recorder.setAudioEncodingBitRate(AUDIO_BITRATE); 

// Customizable Settings such as: 
// recorder.setOutputFile(PATH); 
// recorder.setPreviewDisplay(SURFACE); 
// etc... 

// Prepare and use the MediaRecorder 
recorder.prepare(); 
recorder.start(); 
... 
recorder.stop(); 
recorder.reset(); 
recorder.release(); 

Tôi hy vọng điều này sẽ giúp bạn.

+1

Bạn chính xác, giống như tôi đã đăng, tôi tìm thấy mã cho hàm 'setProfile()'. Nó luôn gọi 'setAudioEncoder()' vì vậy nếu bạn không đặt nguồn âm thanh thì nó sẽ bị lỗi. Câu trả lời là sao chép chức năng này, theo cách đó bạn vẫn có thể sử dụng các cài đặt 'CamcorderProfile' được xây dựng sẵn nhưng cũng chọn cài đặt bạn muốn đặt (tức là âm thanh). Cảm ơn – jacobianism

+0

Vâng, nếu bạn muốn sử dụng Máy quay phim để chỉ có video, bạn cũng có thể làm điều đó. Theo cách đó, bạn có thể nhận được các giá trị có sẵn tối ưu cho bất kỳ thiết bị nào mà không cần phải mã hóa chúng. –

+1

Sau rất nhiều tìm kiếm bài đăng của bạn được thực hiện trong ngày của tôi. Đặt setVideoSize trước setVideoEncoder và setAudioEncoder thực hiện thủ thuật. Cảm ơn – gtsouk