Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用OnAudioFilterRead数据的视频编码错误_Android_Unity3d_Mp4_H.264_Android Mediacodec - Fatal编程技术网

Android 使用OnAudioFilterRead数据的视频编码错误

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

我正在尝试使用OnAudioFilterRead函数将Unity游戏音频录制到mp4文件

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