如何在C中解码此无名几乎是UVC灰度相机的流

时间:2019-01-15 16:51:00

标签: ffmpeg video-capture mjpeg libavcodec libavformat

编辑:我找到了原因。流始终以非JPEG开头。只有在它之后,才有正常的MJPEG流。有趣的是,并非所有使用V4L2 / MJPEG解码器的小例子都能将相机正确产生的内容分成帧。称为&F::operator()的东西是正确执行此操作的罕见示例。可能有一些细节决定了相机的错误是否得到解决。

我有一台几乎与UVC兼容的Noname相机(它没有通过几次兼容性测试)。这是一款相对便宜的全局快门相机,因此我想用它代替正确记录的东西。它将capturev4l2.c报告为(并正确播放)的内容为

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,它抱怨标题,似乎随着每个捕获的流而变化。因此,它看起来像是未包装的JPEG图像流。

因此,我从libavcodec / libavformat中尝试了mjpegtools,但是它在0_hello_world.c处停了,但出现了错误avformat_open_input()。一个100帧的样本文件位于a.raw。您是否知道如何确定将C语言中的图像解码为任何普通位图的方法?

文件是灰度的,不是以恒定值开头的,Invalid data found when processing inputguvcview是我所知道的仅有的播放器,可以将其解码而没有伪像...

1 个答案:

答案 0 :(得分:0)

由于您具有原始流,因此我认为您需要的是带有解析器的解码器。
在ffmpeg上查看以下decode_video.c示例:
https://github.com/FFmpeg/FFmpeg/blob/master/doc/examples/decode_video.c

相应地更改必要的部分,例如avcodec_find_decoder(...)

希望有帮助。