2011-07-11 16 views
10

私はシンプルなビデオ録画アプリ*を修正しようとする際にいくつかの問題を抱えてきました。私は、一連の手順を正しくたどったと思います。以下は、問題を引き起こしているコードの部分を簡略化したものです。このコードは一度だけボタンが押されたコールバックとして実行されます。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でエンコードされることを期待していることです。

私は、途中でfroyoで実行されているsamsung Galaxy I-7500でテストしています。そして私は銀河系I-9000も同じ問題を抱えていると思います。 H264は、ハニカム以降でサポートされている間 http://developer.android.com/guide/appendix/media-formats.htmlを、MPEG_4_SPエンコーディングは、すべてのサポートされてはならない。

私にとって不可解な事は右ここにこのマニュアルに従って、ということです。それではMPEG_4_SPを使っているのはなぜですか? H264で動作させることは可能ですか?

私が得るエラーはあまり明確ではありません。それはまた、LAN経由でビデオをストリーミングして

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) 

*

は実際には、このアプリは、ちょうどそれよりも少し複雑ですが、私はここに心配の部分はそれとは何の関係もありません。 http://code.google.com/p/ipcamera-for-android/

+0

「からコンパイルする必要が任意の与えられたことに注意してくださいモバイルデバイスは、表に記載されていない追加の形式やファイルの種類をサポートしている可能性があります。 –

+1

デバイスはH.264録画をサポートしていますか? Androidのソースに付属しているデバイスまたはカメラアプリのデフォルトのカメラでテストできます。また、オーディオエンコーダのフォーマットをAMRではなくAACに変更することもできます。ドキュメントにはAACとの組み合わせのみが可能であるためです(この情報は、あなたが提供したリンクにあります) – bluefalcon

答えて

6

すでにH.264エンコーディングのサポートは、honeycomb以降(現在はタブレットのみを意味します)を実行しているデバイスからのみ期待できます。 H.264が必要な場合は、の準備ができていないことをテストして、のデバイスをサポートしていないか、または市場フィルタを使用しているH.264のないブロックデバイスをユーザーに知らせる必要があります。または、あなたはアンドロイド用のffmpegをコンパイルすることができます - 他のいくつかのプロジェクトのように。これらのリンクを見てください:

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

http://bambuser.com/opensource

FFmpeg on Android

0

ます。また、それは、Androidをサポートし、それのためにいくつかのサンプルを持ってJCodec

を使用することができます。 のGradleでそれをコンパイルするための最良の方法は次のとおりです。

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

が、最新の改良やバグ修正のためにあなたは、最新のコミット(2016年からの新しいリリースはまだありません)

関連する問題