如果你是一个新手,并且“只想在SW中做”,而不是在SW中做。我假设您的算法不需要实时,并且可以动态压缩视频数据,或者您需要使用硬件编解码器。
这是Android MediaCodec Reference
MediaCodec codec = MediaCodec.createDecoderByType(type);
codec.configure(format, ...);
codec.start();
ByteBuffer[] inputBuffers = codec.getInputBuffers();
ByteBuffer[] outputBuffers = codec.getOutputBuffers();
for (;;) {
int inputBufferIndex = codec.dequeueInputBuffer(timeoutUs);
if (inputBufferIndex >= 0) {
// fill inputBuffers[inputBufferIndex] with valid data
...
codec.queueInputBuffer(inputBufferIndex, ...);
}
int outputBufferIndex = codec.dequeueOutputBuffer(timeoutUs);
if (outputBufferIndex >= 0) {
// outputBuffer is ready to be processed or rendered.
...
codec.releaseOutputBuffer(outputBufferIndex, ...);
} else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
outputBuffers = codec.getOutputBuffers();
} else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
// Subsequent data will conform to new format.
MediaFormat format = codec.getOutputFormat();
...
}
}
codec.stop();
codec.release();
codec = null;
上写着“// OutputBuffer中已准备好被处理或呈现”应用你的解码器就行了。
这是你的第一帧将outputBuffers [0]输出到outputBuffers [outputBufferIndex]。保存outputBufferIndex,即outputBufferIndex_old = outputBufferIndex;那么你的下一帧将是outputbuffers [outputBufferIndex_old]到outputbuffers [outputBufferIndex]。但是,这是一个循环缓冲区,所以在for循环... AHHHHH
是这样的:
//init
int old = 0;
int len = codec.BufferInfo().size,buff_len=outputBuffers.size;
Byte[] processBuffer = new Byte[len];
... // outputBuffer ready
for (int i=old; i<old+len; i++){
processBuffer[i-old] = outputBuffers[i%buff_len];
}
old = outputBufferIndex;
Here就是一个很好的例子。您可能需要查看MediaMetadataRetriever以获取有关输入视频的信息。高度和宽度等。如果您希望您的编码器对不同类型的视频具有较强的鲁棒性,则每像素字节数。无论如何,这应该让你开始。
我强烈建议使用Matlab(或GNU Octave)进行视频编解码器的原型设计。它会为你节省很多时间。这意味着在尝试在几乎不可能的系统上实现它以像Android一样进行调试之前,应确保您的预期编解码器算法有效。
希望这会有所帮助。
来源
2013-09-19 19:16:00
HPP
是不是有人在那里?请帮忙 。该项目的截止日期是关闭。 –