2015-02-03 1 views
0

Я использую stagefright videoencoder для кодирования видео в android 4.4;что-то о формате ввода кодека stagefright в android

sp<AMessage> format = new AMessage; 
format->setInt32("width", 1080); 
format->setInt32("height", 1920); 
format->setString("mime", "video/avc"); 
format->setInt32("color-format", OMX_COLOR_FormatYUV420Planar); 
format->setInt32("bitrate", 1000000); 
format->setFloat("frame-rate", 25); 
format->setInt32("i-frame-interval", 5); 
sp<MediaCodec> videoEncoder = MediaCodec::CreateByType(looper, "video/avc", true); 
videoEncoder->configure(format, NULL, NULL,MediaCodec::CONFIGURE_FLAG_ENCODE); 
videoEncoder->start(); 

но когда я назвал:

status_t err = gSpVideoEncoder->dequeueOutputBuffer(&bufIndex, &offset, &size, &ptsUsec, &flags, kTimeout); 

я получил:

err === INFO_FORMAT_CHANGED 

следующий шаг, я назвал:

sp<AMessage> newFormat; 
videoEncoder->getOutputFormat(&newFormat); 
uint32_t width = 0, height = 0; 
newFormat->findInt32("width", (int32_t *)(&width)); 
newFormat->findInt32("height", (int32_t *)(&height)); 
fprintf(stderr, "new width: %d, height: %d\n", width, height) 

я получил результат:

new width: 1088, height: 1920 

Я смущен (не 1080x1920), должен ли я предоставить новый входной кадр (1088x1920) для видеоэнектора?

ответ

2

Видеокодирование требует, чтобы размеры рамы были выровнены с кратным 16, то есть размерами макроблока. HD-разрешение, то есть 1920 x 1080 - особый случай, поскольку 1080 - это , а не, кратное 16. Подлежащий кодер ожидает, что клиент предоставит выровненную границу.

В этом случае вы можете предоставить данные окна, как показано ниже. Для Luma вам необходимо выровнять до кратного и для Chroma, вам нужно будет выровнять до кратного . Остальные пиксели могут быть предварительно заполнены нулями.

Обратите внимание:: Если кодер способен обрабатывать разрешение 1920 x 1080 в качестве разрешения кодирования, выход должен быть точным. Если кодировщик кодируется с разрешением 1920 x 1088, вы увидите зеленую полосу в нижней части изображения в сгенерированном потоке битов из-за нулевого заполнения.

--------------------------------------------- 
|           | 
|           | 
|           | 
|     Luma     | 
|    1920 x 1080    | 
|    filled into    | 
|    a buffer of    | 
|    1920 x 1088    | 
|           | 
|    Last 8 lines could   | 
|    be filled with zeroes  | 
|           | 
--------------------------------------------- 
----------------------- 
|  Cb   | 
| 960 x 540   | 
| filled into  | 
| a buffer of  | 
| 960 x 544   | 
|      | 
----------------------- 
----------------------- 
|  Cr   | 
| 960 x 540   | 
| filled into  | 
| a buffer of  | 
| 960 x 544   | 
|      | 
----------------------- 
+0

это очень полезно, спасибо очень много ~ _ ~ –

+0

@BingShine .. Если решение устраняет проблему, пожалуйста, примите ответ. – Ganesh