Tôi đã gặp một số sự cố trong khi cố sửa một ứng dụng quay video đơn giản *. Tôi nghĩ rằng tôi đã theo chuỗi các bước một cách chính xác. Sau đây là đơn giản hóa một phần của mã đang gây ra vấn đề cho tôi. Mã này được thực hiện chỉ như là một callback khi một nút được nhấn:Bộ mã hóa H264 trong Android?
if (mRecorder != null){
mRecorder.reset();
mRecorder.release();
}
mRecorder = new MediaRecorder();
if(mViewer.hasSurface){
mRecorder.setPreviewDisplay(mViewer.holder.getSurface());
Log.d(TAG,"Surface has been set");
}
try {
Log.d(TAG,"Sleeping for 4000 mili");
Thread.sleep(4000);
Log.d(TAG,"Waking up");
} catch (InterruptedException e) {
Log.e(TAG,"InterruptedException");
e.printStackTrace();
}
mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mRecorder.setVideoFrameRate(12);
mRecorder.setVideoSize(176, 144);
mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.setMaxDuration(MAX_DURATION_TEST);
String targetFile = "/sdcard/webcamera/temp.mp4";
File localFile = new File(targetFile);
if(localFile.exists()){
Log.d(TAG,"Local file exists");
}else{
Log.d(TAG,"Local file does not exist");
}
mRecorder.setOutputFile(targetFile);
try {
mRecorder.prepare();
bPrepared = true;
Log.i(TAG,"prepared");
return;
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
Log.e(TAG ,"IOException");
Log.e(TAG,"Message: "+e.getMessage());
StackTraceElement[] array = e.getStackTrace();
for(StackTraceElement element : array){
Log.e(TAG,""+element.toString());
}
}
Điều quan trọng mà tôi không hiểu ở đây là bất cứ khi nào tôi đặt bộ mã hóa video được MPEG_4_S nó hoạt động. Mặt khác, bất cứ khi nào tôi đặt bộ mã hóa là H264 thì không. Vấn đề là đoạn mã này chỉ là một phần của một dự án lớn hơn, và phần còn lại của nó hy vọng đoạn video này được mã hóa với h264.
Tôi đang thử nghiệm trên Samsung Galaxy I-7500, chạy trên froyo bằng cách này. Và tôi nghĩ Galaxy I-9000 có cùng một vấn đề.
Điều khó hiểu đối với tôi là theo tài liệu này ngay tại đây: http://developer.android.com/guide/appendix/media-formats.html, không hỗ trợ mã hóa MPEG_4_SP, trong khi H264 được hỗ trợ từ tổ ong. Vậy tại sao nó hoạt động với MPEG_4_SP? và nó có thể làm cho nó hoạt động với H264?
Lỗi tôi nhận được không thực sự rõ ràng.
07-11 00:01:40.626: ERROR/MediaSource(1386): Message: prepare failed.
07-11 00:01:40.766: ERROR/MediaSource(1386): android.media.MediaRecorder._prepare(Native Method)
07-11 00:01:40.766: ERROR/MediaSource(1386): android.media.MediaRecorder.prepare(MediaRecorder.java:508)
07-11 00:01:40.766: ERROR/MediaSource(1386): com.appdh.webcamera.MediaSource.prepareOutput(MediaSource.java:74)
07-11 00:01:40.766: ERROR/MediaSource(1386): com.appdh.webcamera.MainActivity.startDetectCamera(MainActivity.java:312)
* Trên thực tế, ứng dụng phức tạp hơn một chút, vì phần này cũng không liên quan gì đến điều đó. Bạn có thể kiểm tra dự án xen kẽ này ở đây: http://code.google.com/p/ipcamera-for-android/
"Lưu ý rằng bất kỳ trao thiết bị di động có thể cung cấp hỗ trợ cho các định dạng hoặc loại tệp bổ sung không được liệt kê trong bảng. " –
thiết bị có hỗ trợ ghi H.264 không? Bạn có thể kiểm tra nó bằng camera mặc định trên thiết bị hoặc ứng dụng máy ảnh đi kèm với nguồn Android. Bạn cũng có thể thử thay đổi định dạng bộ mã hóa âm thanh thành AAC thay vì AMR .. vì tài liệu cho biết nó có thể được kết hợp với AAC chỉ (thông tin này nằm trong liên kết bạn đã cung cấp) – bluefalcon