我已经使用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;
}
我不确定这是否是错误的来源,但我认为在任意点将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命令验证它。 如下图所示 - 您可以看到表现在被截断。