2017-02-13 38 views
2

Я пытаюсь кодировать h264 в поток в режиме низкой латентности в режиме реального времени с помощью MediaCodec для Android6.0. Есть около 6 кадров латентности от кодера, который я хочу знать, как уменьшитьКак уменьшить задержку кодирования MediaCodec H264

Код от screenrecord.cpp

части коды:

while (true) { 
    encoder->dequeueOutputBuffer(&bufIndex); 
} 

энкодера питаются от поверхности экрана в 320x480 60 fps, и он выводит данные потока с помощью dequeueOutputBuffer(). Есть около 6 кадров для кодировщика, данные которого не возвращаются немедленно с помощью dequeueOutputBuffer(). Другими словами, когда N-й кадр подается, выходные данные энкодера (N-6) -го кадра.

Вопрос 1 - Как уменьшить фреймы, буферизированные в кодере? Можно ли выводить N-й кадр сразу после подачи N-го кадра в кодировщик?

PS: Вопрос 1 тот же, что и для this question. (Пока нет хорошего решения).

Когда поверхностное графическое содержимое внезапно становится статическим, больше кадров не подаются в кодировщик. Странно, что последние 6 кадров данных не могут выводиться на «обычной скорости», они медленно выводятся примерно через 10 секунд.

Вопрос 2 - Как уменьшить латентность выходных данных последних кадров, когда при подаче данных в кодировщик нет данных?

ответ

1

Буферизация определяется видеокодером. Я не думаю, что вы можете с этим справиться, кроме выбора видеокодера, который не ведет себя так.

Если вы не хотите, чтобы выход останавливался, самым простым решением является не приостанавливать ввод. Продолжайте подавать один и тот же фрейм. Кодер должен признать, что ничего не изменилось и генерируется очень мало. screenrecord не работает таким образом - он просто передает фреймы по мере их получения, поэтому вам придется добавить тайм-аут, который повторно передает кадры.