我正在使用 ffmpeg 从 IP 摄像头获取 mjpeg 源并将其转换为一系列静态 jpeg 图像。这是我使用的命令:
ffmpeg -i http://xxx:[email protected]/vid.mjpg -f image2 -vcodec mjpeg %05d.jpg
有人知道在使用 ffmpeg 创建静止图像时指定 jpg 压缩级别的方法吗?
答案1
以下是我最终成功的方法:
ffmpeg -i http://xx.xx/mjpg/video.mjpg -q:v 1 %05d.jpg
这-q:v 1
是票。它设置视频编码器的质量,其中-q
表示质量,:v
表示视频。值的范围从 1 到 31,值越低表示越好。
答案2
$ ffmpeg -r 1/4 -i %03d.jpg -b 5000 -vcodec mjpeg -qscale 1 5000.avi
或者
$ ffmpeg -r 1/4 -i %03d.jpg -vcodec copy -qscale 1 copy.avi
参考:
r delay between next jpg, results 4 second
b bitrate
vcodec use jpeg encode
qscale quality ratio
答案3
您可以尝试导出到 PPM 并使用其他工具转换为 JPEG。
我查看了 ffmpeg/libavcodec/mjpeg.c。我相信质量设置为固定值。
另外,您似乎将 MJPEG 视频转换为 JPEG 静态帧。我认为在这种情况下,ffmpeg/libavcodec/mjpeg2jpeg_bsf.c 中的代码会运行,但数据不会被重新编码。因此图像质量无论如何都不会提高。
这是量化表定义,我没有看到任何对*val_?c 的引用,其中的值在使用前被缩放。
/* Set up the standard Huffman tables (cf. JPEG standard section K.3) */
/* IMPORTANT: these are only valid for 8-bit data precision! */
const uint8_t ff_mjpeg_bits_dc_luminance[17] =
{ /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };
const uint8_t ff_mjpeg_val_dc[12] =
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
const uint8_t ff_mjpeg_bits_dc_chrominance[17] =
{ /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 };
const uint8_t ff_mjpeg_bits_ac_luminance[17] =
{ /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d };
const uint8_t ff_mjpeg_val_ac_luminance[] =
{ 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
答案4
记下特定帧的编号
mpv --osd-msg1='${estimated-frame-number} / ${estimated-frame-count}' vid1.mp4
将帧号保存在一个文件中,例如 frm.txt,然后运行:
sed -i 's/^/eq(n\\,/' frm.txt; sed -i 's/$/)\+/' frm.txt; sed -i '$ s/.$//' frm.txt; #adds eq(n\, #adds )+ at the end of each line #remove + in lastline (last digit)
然后将其提取为 bmp 或 png
frms=$(cat frm.txt); ffmpeg -i vid_1.mp4 -vf "select='$frms'" -fps_mode drop "frames_%03d.bmp"
然后转换为 jpg - 差异是巨大的 350kb(最佳质量的 ffmpeg jpg vs 2MB(bmp 转换为 jpg)!!!!
for pic in *.bmp; do convert -units PixelsPerInch -density 300 -quality 100 "$pic" "${pic//}_j.jpg"; done