【问题标题】:MediaCodec - intentionally adding silence to the audio trackMediaCodec - 故意为音轨添加静音
【发布时间】:2017-03-21 13:35:45
【问题描述】:

我已经设法将多个视频与音轨组合在一起,但后来我意识到,如果我将多个视频组合在一起,其中一个没有音轨,我必须为组合的音轨添加静音。

那么,我该怎么做呢?我应该对一个填充为 0 的 ByteBuffer 进行编码,并带有时间戳以实现静音吗?

【问题讨论】:

    标签: android audio android-mediacodec


    【解决方案1】:

    那么,我该怎么做呢?我是否应该使用时间戳对填充为 0 的 ByteBuffer 进行编码以实现静音?

    基本上是的。我正在使用下面的函数在某个演示时间对静音进行编码。 对于没有音频的视频长度,您应该定期编码静音。我确定间隔应该与之前的音频相匹配。因此,就我而言,我的第一个视频的音频呈现时间间隔为 21333 us。

    使用该信息,我开始对静音进行编码: 从第一个视频的音频+ 21333的最后呈现时间开始, 以 21333 为间隔,直到我编码了足够的静音以持续完整的视频

    我仍在尝试弄清楚如何使用没有音频的视频(作为第一个视频),然后使用有音频的视频。如果我弄明白了,我会更新我的答案。

    private byte[] zerodArray = new byte[2048];// Used to encode silent audio... Not really sure how big this should be ......
    
    private void encodeSilenceForFrame(long presentationTime){
        //mAudioEncoder is the audio encoder you are using to combine the other videos' audio.
        final int TIMEOUT_USEC = 10000;
        int encoderInputBufferIndex = mAudioEncoder.dequeueInputBuffer(TIMEOUT_USEC);
        if (encoderInputBufferIndex == MediaCodec.INFO_TRY_AGAIN_LATER) {
            if (VERBOSE) Log.d(TAG, "no audio encoder input buffer");
        }
        if (VERBOSE) {
            Log.d(TAG, "audio encoder: returned input buffer: " + encoderInputBufferIndex);
        }
        ByteBuffer encoderInputBuffer = mAudioEncoder.getInputBuffer(encoderInputBufferIndex);
        encoderInputBuffer.position(0);
        encoderInputBuffer.put(zerodArray);
        Log.d(TAG, "audio silence: pending buffer for time " + presentationTime);
    
    
        mAudioEncoder.queueInputBuffer(
                encoderInputBufferIndex,
                0,
                zerodArray.length,
                presentationTime,0);
    
    }
    

    【讨论】:

      猜你喜欢
      • 2016-04-18
      • 1970-01-01
      • 1970-01-01
      • 2012-09-04
      • 2015-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多