2011-07-11 39 views
10

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/

+0

"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. " –

+1

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

Trả lời

6

Vì bạn đã viết hỗ trợ mã hóa H.264 chỉ có thể được mong đợi từ các thiết bị đang chạy tổ ong trở lên, hiện chỉ có nghĩa là máy tính bảng. Nếu bạn cần H.264, bạn nên kiểm tra chuẩn bị thất bại và cho người dùng biết rằng thiết bị không được hỗ trợ hoặc chặn thiết bị tốt hơn mà không sử dụng bộ lọc thị trường H.264. Hoặc bạn có thể biên dịch ffmpeg cho android - giống như một số dự án khác. Hãy nhìn vào những liên kết này:

http://odroid.foros-phpbb.com/t338-ffmpeg-compiled-with-android-ndk

http://bambuser.com/opensource

FFmpeg on Android

0

Bạn cũng có thể sử dụng JCodec

Nó hỗ trợ Android và có vài mẫu cho nó. Cách tốt nhất để biên dịch nó với Gradle là:

compile 'com.github.jcodec:jcodec:0.2.0-vg4' 

nhưng đối với những cải tiến mới nhất và các bản sửa lỗi bạn cần phải biên dịch từ các cam kết mới nhất (vẫn không có phiên bản mới từ năm 2016)

Các vấn đề liên quan