Как декодировать в C поток с этой неимеющей почти UVC камеры в градациях серого - PullRequest
0 голосов
/ 15 января 2019

Редактировать: Я нашел причину. Поток всегда начинается с чего-то, что не является JPEG. Только после этого идет нормальный поток MJPEG. Интересно, что не все маленькие примеры использования декодеров V4L2 / MJPEG могут разделить то, что камера производит правильно, на кадры. То, что называется capturev4l2.c, является редким примером правильной работы. Возможно, есть какая-то деталь, которая решает, будет ли работать камера с ошибками или нет.

У меня неамериканская, почти UVC-совместимая камера (она не прошла несколько тестов на совместимость). Это относительно дешевая камера с глобальным затвором, и поэтому я хотел бы использовать ее вместо чего-то надлежащим образом задокументированного. Выводит то, что сообщается (и правильно воспроизводится) mplayer как

Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family
libavcodec version 57.107.100 (external)
Selected video codec: [ffmjpeg] vfm: ffmpeg (FFmpeg MJPEG)

ffprobe показывает следующее:

[mjpeg @ 0x55c086dcc080] Format mjpeg detected only with low score of 25, misdetection possible!
Input #0, mjpeg, from '/home/sc/Desktop/a.raw':
  Duration: N/A, bitrate: N/A
    Stream #0:0: Video: mjpeg, yuvj422p(pc, bt470bg/unknown/unknown), 640x480, 25 tbr, 1200k tbn, 25 tbc

Но, в отличие от mplayer, он не может играть в нее.

Я пробовал decode_jpeg_raw из mjpegtools, он жалуется на заголовок, который, похоже, меняется с каждым захваченным потоком. Так что не похоже на развернутый поток изображений JPEG.

Таким образом, я попытался 0_hello_world.c из libavcodec / libavformat, но он останавливается на avformat_open_input() с ошибкой Invalid data found when processing input. Пример файла с 100 кадрами находится здесь a.raw . Есть ли у вас какие-либо идеи, как определить способ декодирования его в C во что-нибудь простое растровое изображение?

Файл в градациях серого, не начинается с постоянного значения, guvcview и mplayer - единственные известные мне проигрыватели, которые могут декодировать его без артефактов ...

1 Ответ

0 голосов
/ 16 января 2019

Поскольку у вас есть сырой поток, я думаю, что вам нужен декодер с парсером.
Проверьте этот decode_video.c пример на ffmpeg:
https://github.com/FFmpeg/FFmpeg/blob/master/doc/examples/decode_video.c

Измените необходимые детали соответственно, как avcodec_find_decoder(...).

Надеюсь, это поможет.

...