Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了android – 使用MediaCodec截断视频大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我用 Android MediaCodec库来转码视频文件(主要是改变分辨率 Sample code here)

我想要实现的另一件事是截断视频 – 仅开始15秒.逻辑是检查videoExtractor.getSampleTime()是否大于15秒,我只是将EOS写入解码器缓冲区.

但我得到一个异常引起:android.media.MediaCodec $CodecException:Error 0xfffffff3

这是我的代码

while ((!videoEncoderDonE) || (!audioEncoderDonE)) {
        while (!videoExtractorDone
                && (encoderOutputVideoFormat == null || muxing)) {
            int decoderInputBufferIndex = videoDecoder.dequeueInputBuffer(TIMEOUT_USEC);
            if (decoderInputBufferIndex == MediaCodec.INFO_TRY_AGAIN_LATER)
                break;

            ByteBuffer decoderInputBuffer = videoDecoderInputBuffers[decoderInputBufferIndex];
            int size = videoExtractor.readSampleData(decoderInputBuffer,0);
            long presentationTime = videoExtractor.getSampleTime();

            if (size >= 0) {
                videoDecoder.queueInputBuffer(
                        decoderInputBufferIndex,size,presentationTime,videoExtractor.getSampleFlags());
            }
            videoExtractorDone = !videoExtractor.advance();

            if (!videoExtractorDone && videoExtractor.getSampleTime() > mVideoDurationLimit * 1000000) {
                videoExtractorDone = true;
            }

            if (videoExtractorDonE)
                videoDecoder.queueInputBuffer(decoderInputBufferIndex,MediaCodec.bUFFER_FLAG_END_OF_STREAM);
            break;
        }

完整的源代码可以在here找到.

解决方法

我不确定这是否是错误的来源,但我认为在任意点将EOS写入解码器缓冲区是不安全的.

原因是当输入视频使用H264 Main Profile或更高版本时,
pts可能不是递增的顺序(因为存在B帧),所以你可能会错过视频结尾的几帧.
此外,当您发送到解码器的最后一帧是B帧时,解码器可能会期待下一个数据包,但您发送EOS标志并产生错误(不太确定).

你可以做什么,你可以在你到达你想要的帧后使用videoEncoder.signalEndOfInputStream()将EOS标志发送到编码器,(解码器输出的点数保证递增顺序,至少在Android版本> =之后4.3?)

大佬总结

以上是大佬教程为你收集整理的android – 使用MediaCodec截断视频全部内容,希望文章能够帮你解决android – 使用MediaCodec截断视频所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。