如果你是一個新手,並且「只想在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
是不是有人在那裏?請幫忙 。該項目的截止日期是關閉。 –