gpt4 book ai didi

android - MediaCodec - 从 48k Hz 到 44.1k Hz 的下采样音频仍以较慢的速度播放

转载 作者:行者123 更新时间:2023-12-03 01:50:34 26 4
gpt4 key购买 nike

到目前为止,在我使用 MediaCodec 连接视频的过程中,我终于设法将 48k Hz 音频重新采样为 44.1k Hz。

我一直在测试将视频与两个视频连接在一起,第一个具有 22050 Hz 2 channel 格式的音轨,第二个具有 24000 Hz 1 channel 格式的音轨。由于我的解码器只为第一个视频输出 44100 Hz 2 channel 原始音频,为第二个视频输出 48000 Hz 2 channel 原始音频,我重新采样了 ByteBuffers第二个视频的解码器使用此方法从 48000 Hz 输出到 44100 Hz:

private byte[] minorDownsamplingFrom48kTo44k(byte[] origByteArray)
{
int origLength = origByteArray.length;
int moddedLength = origLength * 147/160;
//int moddedLength = 187*36;
int delta = origLength - moddedLength;
byte[] resultByteArray = new byte[moddedLength];
int arrayIndex = 0;
for(int i = 0; i < origLength; i+=44)
{
for(int j = i; j < (i+40 > origLength ? origLength : i + 40); j++)
{
resultByteArray[arrayIndex] = origByteArray[j];
arrayIndex++;
}
//Log.i("array_iter", i+" "+arrayIndex);
}
//smoothArray(resultByteArray, 3);
return resultByteArray;
}

但是,在输出视频文件中,视频在到达具有下采样音轨的第二个视频时播放速度较慢。音高相同,噪音消失,但音频样本播放速度较慢。

在第一个视频之后,我的输出格式实际上是 22050 Hz 2 channel 。

编辑:就好像播放器仍然播放音频,就好像它具有 48000 Hz 的采样率,即使它被下采样到 44100 Hz。

我的问题:
  • 我该如何缓解这个问题?因为我认为在这种情况下更改时间戳不起作用。我只是使用解码器提供的时间戳,并根据第一个视频的最后一个时间戳进行一些偏移。
  • 问题是否与 CSD-0 相关 ByteBuffer年代?
  • 如果 MediaCodec是否可以动态更改视频比特率,动态更改音频采样率或 channel 数的新功能是否可行?
  • 最佳答案

    原来它就像限制我的 ByteBuffers 的大小一样简单。

    解码器输出 8192 字节(2048 个样本)。

    下采样后,数据变为 7524 字节(1881 个样本) - 最初为 7526 字节,但总计 1881.5 个样本,因此我将其向下取整。

    主要错误是在这段代码中,我必须使采样率接近原始值:

    byte[] finalByteBufferContent = new byte[size / 2]; //here

    for (int i = 0; i < bufferSize; i += 2) {
    if ((i + 1) * ((int) samplingFactor) > testBufferContents.length) {
    finalByteBufferContent[i] = 0;
    finalByteBufferContent[i + 1] = 0;
    } else {
    finalByteBufferContent[i] = testBufferContents[i * ((int) samplingFactor)];
    finalByteBufferContent[i + 1] = testBufferContents[i * ((int) samplingFactor) + 1];
    }
    }

    bufferSize = finalByteBufferContent.length;

    在哪里 size是解码器输出 ByteBuffer的长度和 testBufferContents是我用来修改其内容的字节数组(并且是下采样到 7524 字节的字节数组)。

    结果字节数组的长度仍然是 4096 字节而不是 3762 字节。

    更改 new byte[size / 2]new byte[testBufferContents.length / 2]解决了这个问题。

    关于android - MediaCodec - 从 48k Hz 到 44.1k Hz 的下采样音频仍以较慢的速度播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40105892/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com