2016-01-18 8 views
0

Я смог реализовать код, который записывает видео базы на CameraCaptureActivity с графика. Теперь я могу записывать себя с 1 до 10, но когда я иду посмотреть записанное видео, я говорю 1,3,8,9, то есть я пропустил некоторые кадры, которые нужно записать. Поверхность была настроена:Mediacodec для кодирования видео в Интернете

private static int VIDEO_WIDTH = 720; // dimensions for 720p video 
private static int VIDEO_HEIGHT = 1280; 
private static int DESIRED_PREVIEW_FPS = 30; 

и кодер

format.SetInteger(MediaFormat.KeyColorFormat, (int)MediaCodecCapabilities.Formatsurface); 
format.SetInteger(MediaFormat.KeyBitRate, 100000); 
format.SetInteger(MediaFormat.KeyFrameRate, 30); 
format.SetInteger(MediaFormat.KeyIFrameInterval, 5); 

ширина: 310 и высота: 310.

моя проблема битрейта? Какие значения я должен установить для того, чтобы каждый кадр, который я показываю, должен записывать кодер? спасибо.

ответ

2

Я видел, как MediaMuxer приостанавливал работу на диск более 1 секунды, но обычно не с более низкими скоростями передачи данных - скорость передачи 1 Мбит/с, используемая Grafika, должна быть хорошей - и они обычно находятся на расстоянии нескольких секунд друг от друга. Поэтому я не уверен, что это проблема, с которой вы сталкиваетесь.

Здесь есть хорошее сообщение в блоге о проблеме MediaMuxer: http://blog.horizon.camera/post/134263616000/optimizing-mediamuxers-writing-speed. Короче говоря, MediaMuxer записывает киоски, поэтому никакие кадры не выводятся из кодировщика MediaCodec. В итоге MediaCodec исчерпывает буферы и не может принимать никаких дополнительных данных, поэтому камера начинает отбрасывать фреймы.

Обертка звонков MediaMuxer с тегами systrace поможет сузить дело. Идея состоит в том, чтобы скопировать все «интересные» вызовы в настройках кодирования с помощью вызовов /endSection() и собирать выходные данные с тегами --app (example here). Глядя на выход systrace, вы покажете, сколько времени занимает каждая функция, покажите, с какими потоками каждый работает, и помогите вам определить области, где был заблокирован вызов, и голодает другие потоки.

Возможно, что-то еще происходит, но это хорошее место для начала.

+0

Хорошая статья. Я посмотрю! Спасибо, fadden! –