编辑:我找到了原因。流总是以非 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
是我认识的唯一可以在没有文物的情况下对其进行解码的玩家...
最佳答案
由于您有原始流,我认为您需要的是带有解析器的解码器。
检查此decode_video.c
ffmpeg 上的示例:
https://github.com/FFmpeg/FFmpeg/blob/master/doc/examples/decode_video.c
相应地更改必要的部分,例如 avcodec_find_decoder(...)
.
希望有帮助。
关于ffmpeg - 如何在 C 中解码来自这个无名的几乎 UVC 灰度相机的流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54203397/