2017-04-03 13 views
1

私のアプリには、オーディオを録音するボタン(録音終了時に再生するボタン)があります。録音したオーディオファイルをサーバーに送信します。 Androidでは、ファイルは.amr(mime type audio/amr)として記録され、再生することができます。Codename OneでiOSにオーディオを録音することはできますか?

ただし、iOSでは、ファイルはデバイス(iPhone 4または4S)で再生することも、コンピュータで再生することもできません。 ffmpeg -iレポート

[mov,mp4,m4a,3gp,3g2,mj2 @ 0x2fac120] moov atom not found 
9gMjOnnmsj9JJZR3.m4a: Invalid data found when processing input 

はVLCはどちらかそれを再生することはできませんのでご注意ください。

ボイスレコーダーが(aacコーデックと一緒に)それを使用するため、m4aの内線番号を付けます。また

audioMemoPath = ParametresGeneraux.getWRITABLE_DIR() + "AudioMemo-" 
      + System.currentTimeMillis() + 
      (Display.getInstance().getPlatformName().equals("and") 
      ? ".amr" 
      : ".m4a"); 
audioMemoMimeType = MediaManager.getAvailableRecordingMimeTypes()[0]; 

audioMemoRecorder = MediaManager.createMediaRecorder(audioMemoPath, audioMemoMimeType); 

// If the permission audio has not been granted 
// the audiomemorecoreder will be null 
    if (audioMemoRecorder != null) { 
      audioMemoRecorder.play(); 
      boolean b = Dialog.show("Recording", "", "Save", "Cancel"); 
      audioMemoRecorder.pause(); 
      audioMemoRecorder.cleanup(); 

      ... 
     } 

私はiOSで利用可能なMIMEタイプを表示した場合、それは私はすべての記事によると疑う「オーディオ/ AMR」をもたらす:ここ

は(ほとんど https://github.com/codenameone/CodenameOne/blob/master/Ports/iOSPort/src/com/codename1/impl/ios/IOSImplementation.java#L2768-L2794に基づいて)私が使用するコードであります私はそれがiOS上でサポートされていないことをあなたに伝えることができます。それは常に返されるため、AMRは、デフォルトのMIMEタイプによってで表示され、ソースを見てみると:

/** 
* Gets the available recording MimeTypes 
*/ 
public String [] getAvailableRecordingMimeTypes(){ 
    return new String[]{"audio/amr"}; 
} 

だから私の質問は:それは、iOS上で音声を録音することが可能であり、それがある場合、どのようにそれを行うことができますか?

ありがとうございました。

答えて

1

[OK]を私はそのgetAvailableRecordingMimeTypesメソッドを使用してからそれを防ぐためにMediaManager、すなわちgetAvailableRecordingMimeTypes()ともcreateMediaRecorder()のいくつかのメソッドをオーバーロードすることにより、作業それを得ました。

/** 
* Normally the method returns amr even for ios. So we overload the original 
* method to return aac on ios. 
* @return 
*/ 
public static String[] getAvailableRecordingMimeTypes() { 
    if (Display.getInstance().getPlatformName().equals("ios")) { 
     return new String[]{"audio/aac"}; 
    } else { 
     return new String[]{"audio/amr"}; 
    } 

} 

createMediaRecorder()を(変更せずにコピー)されるように残される:ここ

はgetAvailableRecordingMimeTypes()のコードです。

これで、iOSでオーディオを録音し、iOSとAndroidで再生することができます。

2

Captureクラスを見ましたか?それはもっと簡単なようです。

https://www.codenameone.com/javadoc/index.html

+0

Jamesに感謝します。しかし、録音のデュラトゥオンを制限する必要があるので、私は 'MediaRecorder'に頼ったのです。しかし、キャプチャから何が出力されているかを見ることができます。 – HelloWorld

+0

私はあなたに提案を試みましたが、録音されたファイルはモバイルデバイスで再生できません(detaisについてはこちらをご覧くださいhttp://stackoverflow.com/questions/43193249/is-it-possible-to-record-audio-in-ios-with-コードネーム1) – HelloWorld

+0

私は細部についてそこに意味した! http://stackoverflow.com/questions/43226775/why-is-codename-one-on-ios-recording-audio-as-caf – HelloWorld

関連する問題