Android 使用OnAudioFilterRead数据的视频编码错误
我正在尝试使用OnAudioFilterRead函数将Unity游戏音频录制到mp4文件Android 使用OnAudioFilterRead数据的视频编码错误,android,unity3d,mp4,h.264,android-mediacodec,Android,Unity3d,Mp4,H.264,Android Mediacodec,我正在尝试使用OnAudioFilterRead函数将Unity游戏音频录制到mp4文件 function OnAudioFilterRead(var data:float[], var channels:int) 我的解决方案概述 第一步。将从Unity获取的数据样本转换为字节[] private void Convert2Bytes(float[] samples) { Int16[] intData = new Int16[samples.Length]; //conve
function OnAudioFilterRead(var data:float[], var channels:int)
我的解决方案概述第一步。将从Unity获取的数据样本转换为字节[]
private void Convert2Bytes(float[] samples) {
Int16[] intData = new Int16[samples.Length];
//converting in 2 float[] steps to Int16[], //then Int16[] to Byte[]
Byte[] bytesData = new Byte[samples.Length * 2];
//bytesData array is twice the size of
//dataSource array because a float converted in Int16 is 2 bytes.
float rescaleFactor = 32767; //to convert float to Int16
for (int i = 0; i<samples.Length; i++) {
intData[i] = (short) ((samples[i] * gain) * rescaleFactor);
int n = i*2;
bytesData[n] = (byte)(intData[i]& 0x00FF);
bytesData[n+1] = (byte)(((intData[i]& 0xFF00) >> 8) );
if (muteSceneAudio)
samples[i] = 0.0f;
}
return bytesData;
}
第三步。退出队列输出缓冲区并写入视频
int encoderStatus = encoder.dequeueOutputBuffer(bufferInfo, TIMEOUT_USEC);
if (encoderStatus == MediaCodec.INFO_TRY_AGAIN_LATER) {
// Bug here
}
错误日志(停止录制时发生):
AndroidJavaException:java.lang.IllegalStateException
位于:0中的UnityEngine.AndroidJNISafe.CheckException()[0x00000]处
在:0中的UnityEngine.AndroidJNISafe.CallVoidMethod(IntPtr obj、IntPtr methodID、UnityEngine.jvalue[]args)[0x00000]处
在UnityEngine.AndroidJavaObject.\中调用(System.String methodName,System.Object[]args)[0x00000]in:0
在UnityEngine.AndroidJavaObject.Call(System.String methodName,System.Object[]args)[0x00000]中:0
位于VideoCapture.stopAudioRecord()[0x00000]中:0
在:0中的OOTAudioRecord.SaveStreamStop()[0x00000]处
当我试着从麦克风录制音频时,它能解决我的问题吗?私有void Convert2Bytes(float[]samples)返回Byte[],但它声明的返回类型为void。
int encoderStatus = encoder.dequeueOutputBuffer(bufferInfo, TIMEOUT_USEC);
if (encoderStatus == MediaCodec.INFO_TRY_AGAIN_LATER) {
// Bug here
}
AndroidJavaException: java.lang.IllegalStateException
at UnityEngine.AndroidJNISafe.CheckException () [0x00000] in <filename unknown>:0
at UnityEngine.AndroidJNISafe.CallVoidMethod (IntPtr obj, IntPtr methodID, UnityEngine.jvalue[] args) [0x00000] in <filename unknown>:0
at UnityEngine.AndroidJavaObject._Call (System.String methodName, System.Object[] args) [0x00000] in <filename unknown>:0
at UnityEngine.AndroidJavaObject.Call (System.String methodName, System.Object[] args) [0x00000] in <filename unknown>:0
at VideoCapture.stopAudioRecord () [0x00000] in <filename unknown>:0
at OOTAudioRecord.SaveStreamStop () [0x00000] in <filename unknown>:0