一个基本的命令:
ffmpeg -f alsa -i <device> out.mp3
其中,
-f 表示设置格式,有format的意思,out.mp3前面可以加上 -f mp3, 因为带了mp3后缀,就省略了。
alsa 表示alsa音频驱动程序的编码格式,它保证后面的音频流可以由alsa解码。具体可根据驱动程序选择。(alsa主页https://www.alsa-project.org)
-i 表示从后面的 url 输入(音频流),url(Uniform Resource Locator,统一资源定位器)不仅可表示网址,还能表示文件路径。如果是麦克风设备,则是捕获麦克风采集的音频,需要设备在计算机中的url,比如 hw:1。
out.mp3输出文件路径(默认当前文件夹)。
如果出现
cannot open audio device ... (No such file or directory)
是因为没检测到麦克风之类设备,可以先使用
arecord -l
(注意最后的l, 是字母l, 大写为L,意为list, 列表,即罗列出来)
从card 1到n罗列出了录音设备,我们需要的就是数字后面跟着的名字。不一定,只需要数字就够了。
比如选择了card 1,把ffmpeg的命令中的<device>换成 plug:front:1,或者hw:1也可以,
如果不用数字,用名字,就换成
plug:default:名字
或
plug:front:名字
具体请参考:
https://www.alsa-project.org/main/index.php/DeviceNames
。
如果录制视频,一个基本的ffmpeg命令为:
ffmpeg -f v4l2 -i <device> out.mp4
v4l是video for linux的简写,
v4l2是v4l-utils的一种编码格式。具体可根据驱动程序选择。
v4l-utils是一个Linux的视频驱动程序集,(没有需安装)
具体的<device>可以用
v4l2-ctl --list-devices查看图形设备,
Linux把设备当成文件对待,所以摄像头设备存放于/dev/*,一般是/dev/video0
把ffmpeg命令中的<device>替换成/dev/video0就好。
同时录制音频和视频,输出一个有声音的视频:
ffmpeg -f v4l2 -i /dev/video0 -f alsa -i hw:1 out.mp4
可以看到有两个 -f 了,分别是音频的和视频的,输出文件还是一个。
如果无法播放,根据http://trac.ffmpeg.org/wiki/Errors 说明:
No pixel format specified, yuv444p for H.264 encoding chosen. Use -pix_fmt yuv420p for compatibility with outdated media players.
Your input and output may vary in supported pixel formats. ffmpeg will attempt to choose the "best" supported pixel format for your encoder. For libx264 it may use a pixel format that is not decodable by many non-FFmpeg based media players.
Adding -pix_fmt yuv420p or -vf format=yuv420p will ensure compatibility with dumb players.
(本文链接https://www.cnblogs.com/oler/p/13437701.html)
以上, 意思是把pixel_format(像素格式)改成yuv420p以兼容一些傻瓜播放器。提供两个选项:-pix_fmt yuv420p 或 -vf format=yuv420p,我尝试了一下,命令如下:
ffmpeg -f v4l2 -i /dev/video0 -f alsa -i hw:1 -pix_fmt yuv420p out.mp4
在out.mp4 前面加了pix_fmt选项,指定为yuv420p,就可以用windows自带播放器播放了,也能嵌入网页播放了。其他pix_fmt格式可用ffmpeg -pix_fmts查询。
如果录出来的视频声音或画面卡顿不清,并且输出信息有ALSA buffer xrun,还有Thread message queue blocking; consider raising the thread_queue_size option (current value: 8)
从英文意思就可以看出,是因为thread_queue_size不够,看它前面【】里面@的是alsa还是v4l2, 在相应的 -f 前面加上 -thread_queue_size 再加个数值就好了,从8,16,32,64翻倍加(翻倍加比较快一点),直到没有上述提示就好了。我一直把视频加到了128,音频加到了4096,才没有了错误提示,视频中的音质也好了很多:
ffmpeg -thread_queue_size 128 -f v4l2 -i /dev/video0 -thread_queue_size 4096 -f alsa -i hw:1 -pix_fmt yuv420p out.mp4
不过鉴于树莓派的性能较低,应该设置视频的码率,清晰度,音频采样率低一点,而不是盲目加塞。
其他的参数设置请参考ffmpeg的命令详解,这里提供的命令仅仅是最基本的。