Редактировать: Я нашел причину. Поток всегда начинается с чего-то, что не является 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
- единственные известные мне проигрыватели, которые могут декодировать его без артефактов ...