2011-07-11 67 views
10

我試圖修復一個簡單的視頻錄製應用程序*時遇到了一些問題。我認爲我正確地遵循了步驟的順序。以下是對我提出問題的部分代碼的簡化。此代碼僅因爲一旦按下按鈕,回調執行:在Android的H264編碼器?

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

我不明白這裏最重要的是,每當我把視頻編碼器是MPEG_4_S它的工作原理。另一方面,每當我把編碼器是H264它只是沒有。問題是這段代碼只是一個更大的項目的一部分,其餘的預計這個視頻是用h264編碼的。

我在三星Galaxy I-7500上測試,順便在froyo上運行。我認爲Galaxy I-9000也有同樣的問題。

對我來說令人費解的是,根據這裏的文檔: http://developer.android.com/guide/appendix/media-formats.html,根本不支持MPEG_4_SP編碼,而自蜂窩以來支持H264。那麼爲什麼它完全符合MPEG_4_SP?是否有可能使它與H264一起工作?

我得到的錯誤不是很清楚。

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) 

*事實上,應用程序是一個小的不僅僅是這些複雜的,因爲它也做了流LAN的視頻,但我擔心這裏的部分無關這一點。你可以在這裏檢查此interesing項目了:http://code.google.com/p/ipcamera-for-android/

+0

「請注意,任何給定的移動設備可能會提供對錶格中未列出的其他格式或文件類型的支持。「 –

+1

該設備是否支持H.264錄製?您可以使用設備上的默認相機或android源代碼附帶的相機應用程序對其進行測試。您也可以嘗試將音頻編碼器格式更改爲AAC而不是AMR ..因爲文檔說它只能與AAC結合使用(此信息位於您提供的鏈接中) – bluefalcon

回答

6

正如你已經寫了支持H.264編碼只能從運行蜂窩及更高版本,目前只意味着平板電腦設備的預期。如果您需要H.264,您應該測試準備失敗的,並告訴用戶該設備不受支持,或者更好地阻止未使用市場過濾器的H.264設備。或者你可以爲android編譯ffmpeg - 就像其他幾個項目一樣。看看這些鏈接:

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

http://bambuser.com/opensource

FFmpeg on Android

0

您還可以使用JCodec

它支持Android和有它幾個樣品。 與搖籃編譯它,最好的辦法是:

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

但最新的改進和bug修復,你需要從最新提交編譯(還有2016年沒有新的版本)

相關問題