是否可以使用代号一在 iOS 中录制音频?
Is it possible to record audio in iOS with Codename One?
我的应用程序有一个用于录制音频的按钮(还有一个用于在录制结束时播放它)。我将录制的音频文件发送到服务器上。在 Android 上,文件被记录为 .amr(mime 类型 audio/amr)并且可以播放。
在 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也无法播放
我给了 m4a 扩展名,因为录音机使用它(连同 aac 编解码器)。
这是我使用的代码(主要基于 https://github.com/codenameone/CodenameOne/blob/master/Ports/iOSPort/src/com/codename1/impl/ios/IOSImplementation.java#L2768-L2794 ):
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 类型,它会产生 "audio/amr",根据我能读到的所有帖子,我怀疑 iOS 上不支持 amr ].查看源代码,amr 似乎是默认的 mime 类型,因为它总是被返回:
/**
* Gets the available recording MimeTypes
*/
public String [] getAvailableRecordingMimeTypes(){
return new String[]{"audio/amr"};
}
所以我的问题是:是否可以在 iOS 上录制音频,如果可以,如何实现?
感谢任何帮助,
你看过捕获class了吗?这样似乎更直接。
好的,我通过重载 MediaManager
的一些方法使其工作,即 getAvailableRecordingMimeTypes()
和 createMediaRecorder()
以防止它使用其 getAvailableRecordingMimeTypes
方法。
这是 getAvailableRecordingMimeTypes() 的代码:
/**
* 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()
保持原样(未经更改复制)。
现在可以在 iOS 中录制音频并在 iOS 和 Android 中播放!
我的应用程序有一个用于录制音频的按钮(还有一个用于在录制结束时播放它)。我将录制的音频文件发送到服务器上。在 Android 上,文件被记录为 .amr(mime 类型 audio/amr)并且可以播放。
在 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也无法播放
我给了 m4a 扩展名,因为录音机使用它(连同 aac 编解码器)。
这是我使用的代码(主要基于 https://github.com/codenameone/CodenameOne/blob/master/Ports/iOSPort/src/com/codename1/impl/ios/IOSImplementation.java#L2768-L2794 ):
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 类型,它会产生 "audio/amr",根据我能读到的所有帖子,我怀疑 iOS 上不支持 amr ].查看源代码,amr 似乎是默认的 mime 类型,因为它总是被返回:
/**
* Gets the available recording MimeTypes
*/
public String [] getAvailableRecordingMimeTypes(){
return new String[]{"audio/amr"};
}
所以我的问题是:是否可以在 iOS 上录制音频,如果可以,如何实现?
感谢任何帮助,
你看过捕获class了吗?这样似乎更直接。
好的,我通过重载 MediaManager
的一些方法使其工作,即 getAvailableRecordingMimeTypes()
和 createMediaRecorder()
以防止它使用其 getAvailableRecordingMimeTypes
方法。
这是 getAvailableRecordingMimeTypes() 的代码:
/**
* 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()
保持原样(未经更改复制)。
现在可以在 iOS 中录制音频并在 iOS 和 Android 中播放!