编辑:我找到了原因。流始终以非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 input
和guvcview
是我所知道的仅有的播放器,可以将其解码而没有伪像...
答案 0 :(得分:0)
由于您具有原始流,因此我认为您需要的是带有解析器的解码器。
在ffmpeg上查看以下decode_video.c
示例:
https://github.com/FFmpeg/FFmpeg/blob/master/doc/examples/decode_video.c
相应地更改必要的部分,例如avcodec_find_decoder(...)
。
希望有帮助。