ffmpeg 推流参数配置中关于输入格式(--input_format)问题

2021-03-07 22:19:45 +08:00
 Orciorc

最近在做一个关于视频推流的项目,使用到 ffmpeg 推流,推流命令如下:

ffmpeg -i /dev/video0 -input_format mjpeg -s:v 1920x1080 -framerate 30 -f flv

但 ffmpeg 完全无视了-input_format mjpeg,仍然使用 YUYV:

Input #0, video4linux2,v4l2, from '/dev/video0':

Duration: N/A, bitrate: 165888 kb/s

Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 1920x1080, 165888 kb/s, 5 fps, 5 tbr, 1000k tbn, 1000k tbc

之所以要用 mjpeg 格式,是因为我使用的 USB 摄像头只能在mjpg下使用1080p@30Hz

pi@raspberrypi:~ $ v4l2-ctl --list-formats-ext -d /dev/video0 ioctl: VIDIOC_ENUM_FMT Type: Video Capture

[0]: 'MJPG' (Motion-JPEG, compressed)
	Size: Discrete 640x480
		Interval: Discrete 0.033s (30.000 fps)
		Interval: Discrete 0.040s (25.000 fps)
		Interval: Discrete 0.033s (30.000 fps)
		Interval: Discrete 0.040s (25.000 fps)
	Size: Discrete 1920x1080
		Interval: Discrete 0.033s (30.000 fps)
		Interval: Discrete 0.040s (25.000 fps)
	Size: Discrete 1280x960
		Interval: Discrete 0.033s (30.000 fps)
		Interval: Discrete 0.040s (25.000 fps)
	Size: Discrete 1280x720
		Interval: Discrete 0.033s (30.000 fps)
		Interval: Discrete 0.040s (25.000 fps)
	Size: Discrete 640x480
		Interval: Discrete 0.033s (30.000 fps)
		Interval: Discrete 0.040s (25.000 fps)
		Interval: Discrete 0.033s (30.000 fps)
		Interval: Discrete 0.040s (25.000 fps)
[1]: 'YUYV' (YUYV 4:2:2)
	Size: Discrete 640x480
		Interval: Discrete 0.033s (30.000 fps)
		Interval: Discrete 0.033s (30.000 fps)
	Size: Discrete 1920x1080
		Interval: Discrete 0.200s (5.000 fps)
	Size: Discrete 1280x960
		Interval: Discrete 0.200s (5.000 fps)
	Size: Discrete 1280x720
		Interval: Discrete 0.200s (5.000 fps)
	Size: Discrete 640x480
		Interval: Discrete 0.033s (30.000 fps)
		Interval: Discrete 0.033s (30.000 fps)

https://ffmpeg.org/ffmpeg-devices.html#Options-18 中提到

input_format: Set the preferred pixel format (for raw video) or a codec name. This option allows one to select the input format, when several are available.

请问如何强制 ffmpeg 使用 mjpg 格式输入呢?

1176 次点击
所在节点    程序员
3 条回复
ETiV
2021-03-07 22:46:49 +08:00
我很确定的是:ffmpeg 对参数顺序是有要求的 https://ffmpeg.org/ffmpeg.html

> As a general rule, options are applied to the next specified file. Therefore, order is important, and you can have the same option on the command line multiple times. Each occurrence is then applied to the next input or output file. Exceptions from this rule are the global options (e.g. verbosity level), which should be specified first.


你需要把能够影响到 -i /dev/video0 的参数们(比如 -input_format mjpeg )放到 -i 的前面
ETiV
2021-03-07 22:47:42 +08:00
> 只能在 mjpg 下使用 1080p@30Hz

我注意到了你加粗了这段,那就是这 3 个参数都要挪到 -i 前面 🤣
Orciorc
2021-03-07 22:59:32 +08:00
@ETiV #2 感谢!果真如此! 这真是一个神奇的 feature……

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/759382

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX