2013-08-23 2 views
1

Я использовал библиотеку ffmpeg для декодирования видео и получил данные буфера кадра.Как скопировать декодированный кадр с C на Android

Я хочу скопировать буфер кадра в массив байтов Android (формат RGB565).

Как скопировать данные буфера кадра из C в массив байтов Android?

Может ли кто-нибудь дать мне пример или совет?

ответ

1

Вы можете использовать java.nio.ByteBuffer для этого:

ByteBuffer theVideoFrame = ByteBuffer.allocateDirect(frameSize); 
... 
CopyFrame(theVideoFrame); 

И нативный код может быть что-то вроде:

JNIEXPORT void JNICALL Java_blah_blah_blah_CopyFrame(JNIEnv *ioEnv, jobject ioThis, jobject byteBuffer) 
{ 
    char *buffer; 

    buffer = (char*)(ioEnv->GetDirectBufferAddress(byteBuffer)); 
    if (buffer == NULL) { 
     __android_log_write(ANDROID_LOG_VERBOSE, "foo", "failed to get NIO buffer address"); 
     return; 
    } 

    memcpy(buffer, theNativeVideoFrame, frameSize); 
} 

Чтобы скопировать данные из ByteBuffer в byte[] вы бы затем использовать что-то например:

theVideoFrame.get(byteArray); 
+0

Спасибо за ваш ответ. Но есть небольшая проблема, правильным вызовом функции может быть 'char * buffer = (* env) -> GetDirectBufferAddress (env, jobj);'. – Jar

+0

О, право. То, как я называл «GetDirectBufferAddress», для C++. В C вы использовали бы то, как вы написали в своем комментарии. – Michael

+0

Я пытаюсь использовать ваш код, я обнаружил, что в C функция выполняется успешно, но обратно в Java бросает ошибку NULL, такой код, «Bitmap mBitmap = Bitmap.createBitmap (w, h, Bitmap.Config.RGB_565)); ByteBuffer mByteBuffer = ByteBuffer.allocateDirect (w * h * 2); getFrame (mByteBuffer); // Это собственная функция mBitmap.copyPixelsFromBuffer (mByteBuffer); // Faild' Это скопированный сбой? – Jar

Смежные вопросы