当前位置: 首页 > 知识库问答 >
问题:

用MediaCodec截断视频

慕容博涛
2023-03-14

我已经使用Android MediaCodec库来转码视频文件(这里主要是更改分辨率示例代码)

我想做的另一件事是截断视频--只花15秒开始。逻辑是检查videoextractor.getSampleTime()是否大于15秒,我将向解码器缓冲区写入EOS

但是我得到了一个异常,原因是:Android.media.mediaCodec$CodeException:Error 0xFFFFFF3

        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,
                        0,
                        size,
                        presentationTime,
                        videoExtractor.getSampleFlags());
            }
            videoExtractorDone = !videoExtractor.advance();

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

            if (videoExtractorDone)
                videoDecoder.queueInputBuffer(decoderInputBufferIndex,
                        0, 0, 0,  MediaCodec.BUFFER_FLAG_END_OF_STREAM);
            break;
        }

共有1个答案

充昌勋
2023-03-14

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

原因是当输入视频使用H264或以上的主配置文件时,pts可能不在递增顺序(因为B帧的存在),所以在视频结束时可能会错过几个帧。此外,当您发送到解码器的最后一个帧是B帧时,解码器可能期待下一个数据包,但您发送EOS标志并产生错误(不太确定)。

但是,您可以做的是,在您到达所需的帧后,您可以使用videoencoder.signalendoFinputStream()将EOS标志发送到编码器(解码器输出的pts被保证是递增的,至少在android版本>=4.3之后是这样?)

 类似资料:
  • 我正在使用Java API实现一个解码器,用于解码实时H.264远程流。我正在使用回调()从本机层接收H.264编码数据,并在的上解码和呈现。我的实现已经完成(使用回调、解码和呈现等方式检索编码流)。下面是我的解码器类: 现在的问题是-流正在解码和呈现在表面,但视频不清楚。看起来像是框架被打破了,场景被扭曲了/脏了。移动是破碎的和方形的碎片到处(我真的很抱歉,因为我没有截图现在)。 关于我的流-它

  • 我想将本地保存的视频文件压缩到更小的大小,以便上传到服务器。 自从我使用MediaCodec以来,我发现了一些压缩视频的技巧。以下是我遵循的步骤 1) . 使用MediaExrtactor提取媒体文件并对其进行解码。2) . 使用所需的文件格式创建编码器(3)。创建muxer以将文件保存在本地存储中。(不完整) 问题:但我不知道如何对已经解码的流进行编码,并使用MediaMuxer将其保存到本地存

  • 输出视频创建成功,没有任何问题,但mediacodec已经更改了更改的测试值,我无法检索它。 这是我的问题,这是一个正确的方法做视频隐写在Android?如果这不是正确的方法,你能提出一个建议吗?

  • 在我的Android应用程序中,我想通过改变mp4视频的分辨率、比特率来压缩mp4视频。我不想使用FFmpeg(因为我不想使用NDK),所以我决定使用MediaCodec API。 以下是我的逻辑步骤: null 我的问题是:我不知道如何设置解码器的输出和编码器的输入之间的连接。我可以将视频解码到一个表面,或者从一个表面编码一个新的视频。但我不明白怎么把它们联系起来。 我阅读了以下链接:Andro

  • 问题内容: 截断->这将重置整个表,是否可以通过截断来重置特定的记录/检查条件。 例如:我想重置所有数据并在表中保留过去30天。 谢谢。 问题答案: 不,是全部还是全部。您可以这样做,但这会失去的速度优势。

  • 命令用于截断表。 如果您截断表,表的所有行将永久删除。 语法: 示例: 我们有一个名为“”的表具有以下数据(创建表并插入数据): 现在,我们使用命令: 现在表已经被截断了,您可以使用SELECT命令验证它。 如下图所示 - 您可以看到表现在被截断。