Камера Android Декодирование видеокадров искажается горизонтальными линиями - PullRequest
0 голосов
/ 25 мая 2018

Я портирую на следующий тестовый пример Android для запуска в простом проекте Xamarin Android.

https://bigflake.com/mediacodec/ExtractMpegFramesTest_egl14.java.txt

Я запускаю видео, снятое камерой (включеното же самое устройство) через этот конвейер, но PNG, которые я получаю на другом конце, искажены, я полагаю, из-за минного поля цветовых пространств камеры Android.

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

https://imgur.com/a/nrOVBPk

Трудно сказать, но это "вроде" выглядит так, как будто это одна линия реального изображения, натянутая поперек.Но я, честно говоря, не хотел бы рассчитывать на эту проблему, так как это может быть красная сельдь.

Однако, когда я запускаю «нормальное» видео, которое я получил онлайн через тот же конвейер, оно работает полностьюхорошо.

Я использовал первое найденное здесь видео (лего) http://techslides.com/sample-webm-ogg-and-mp4-video-files-for-html5

И я получаю такие кадры ...

https://imgur.com/a/yV2vMMd

Извлекая некоторые из данных зонда ffmpeg для видео, и это, и видео моей камеры имеют одинаковый формат пикселей (pix_fmt = yuv420p), но есть различия в color_range.

Видео, которое работает,

color_range=tv
color_space=bt709
color_transfer=bt709
color_primaries=bt709

И видео с камеры просто имеет ...

color_range=unknown
color_space=unknown
color_transfer=unknown
color_primaries=unknown

Медиа формат видео с камеры выглядит как SemiPlanar YUV, выход кодека обновляется донаименее.Я получаю сообщение OutputBuffersChanged, в котором для выходного буфера MediaCodec устанавливается следующее значение:

{
    mime=video/raw,
    crop-top=0, 
    crop-right=639, 
    slice-height=480,
    color-format=21,
    height=480, 
    width=640, 
    what=1869968451, 
    crop-bottom=479, 
    crop-left=0, 
    stride=640
}

. Я также могу указать вывод кодека на TextureView, а не на поверхность OpenGL, и просто получить растровое изображение таким образом (очевидно медленнее) и эти кадры выглядят нормально.Так что, может быть, это OpenGL-дисплей необработанного вывода кодеков?Работает ли Android TextureView при декодировании?

Примечание. Причина, по которой я смотрю на все это, заключается в том, что у меня есть необходимость попробовать запустить некоторую форму обработки изображений на необработанной камере с частотой 30 кадров в секунду,возможный.Очевидно, что на некоторых устройствах это невозможно, но возможен обходной путь, который я изучаю, но запись видео со скоростью 30 кадров в секунду и последующая обработка видео после факта.Я бы лучше попробовал обработать изображение в OpenGL для повышения скорости, чем брать каждый кадр в качестве растрового изображения из вывода TextureView.

Исследуя это, я видел кого-то еще с почти такой же проблемой здесь Как правильно сохранить кадры из mp4 в виде png-файлов, используя ExtractMpegFrames.java?, хотя ему, похоже, не очень повезло, выяснив, что может быть не так.

EDIT - FFMpeg Probe outputдля обоих видео ...

Видео, которое работает - https://justpaste.it/484ec.
Видео, которое не удается - https://justpaste.it/55in0.

...