gpt4 book ai didi

android - 使用 MediaCodec 截断视频

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:14:55 26 4
gpt4 key购买 nike

我用过Android MediaCodec库转码视频文件(主要是改变分辨率Sample code here)

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

但我得到一个异常Caused by: 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,
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;
}

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

最佳答案

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

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

但您可以做的是,您可以在达到所需帧后使用 videoEncoder.signalEndOfInputStream() 将 EOS 标志发送到编码器,(解码器输出的点保证在增加顺序,至少在 android 版本 >= 4.3 之后?)

关于android - 使用 MediaCodec 截断视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39568330/

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