linux 树莓派 debian ffmpeg alsa v4l2 录制音频 视频 cannot open audio device 无法播放 声音模糊 画面卡顿 ALSA buffer xrun Thread message queue blocking -pix_fmt

摘要:
基本命令:ffmpeg falsa-i<设备>在out.mp3中,-f表示设置格式,即格式。-fmp3可以添加在out.mp3前面,因为省略了mp3后缀。Alsa表示Alsa音频驱动程序的编码格式,确保后续音频流可以被Alsa解码。可根据驾驶员选择详细信息。(alsa主页https://www.alsa-project.org)-I表示以下url

一个基本的命令:

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的命令详解,这里提供的命令仅仅是最基本的。

免责声明:文章转载自《linux 树莓派 debian ffmpeg alsa v4l2 录制音频 视频 cannot open audio device 无法播放 声音模糊 画面卡顿 ALSA buffer xrun Thread message queue blocking -pix_fmt》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇python基础数据类型一(集合)drf 准备知识(Web应用模式、 api接口、RESTful API规范和序列化)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux--安装node.js

前戏 node.js是前端开发者必须会使用,它里面的npm可以安装前端所使用的一些包。现在的node.js已经内置了npm,所以我们只需要安装node.js就可以了,我这里以安装node.js8.11.1为例 安装node.js 1.下载node.js 8.11.1包 wget https://nodejs.org/dist/v8.11.1/node-v8...

Linux 进程间通信(一)

Linux 进程间通信   进程是一个独立的资源分配单位,不同进程之间的资源是相互独立的,没有关联,不能在一个进程中直接访问另一个进程中的资源。但是,进程不是孤立的,不同的进程之间需要信息的交换以及状态的传递,因此需要进程间数据传递、同步与异步的机制。 分类 统一主机间进程通信 Unix进程间通信方式 无名通道 有名通道 信号 System V进...

linux centos8 安装 composer2.0

1 安装前准备 先安装php 再安装php-json扩展 yum install php-json  参考 https://blog.csdn.net/alinathz/article/details/105885254 2 安装 官网安装方法 https://getcomposer.org/download/ php -r "copy('https:/...

Debian下自动备份文件并上传到远程FTP服务器且删除指定日期前的备份Shell脚本

      说明:  1、备份目录/home/osyunwei下面所有的文件到/home/osyunweibak里面,并且保存为osyunwei20120701.tar.gz的压缩文件格式(2012_07_01是指备份执行时当天的日期),最后只保留最近7天的备份 2、上传/home/osyunweibak里面的备份文件到远程FTP服务器上,并且只保留最近7...

linux命令之添加删除磁盘分区

之前已经写过df和fdisk的区别了,df可以显示当前已经挂载的磁盘分区,df -T可以额外显示文件系统类型 fdisk -l可以显示出所有挂载未挂载的分区,但不显示文件类型 在我的虚拟机上有一块分配了40G的硬盘但未使用,使用fdisk -l 对于40G的磁盘就是只显示了 Disk /dev/sdb 40G,并未有对应的Device, 接下来就是对其分区...

linux下如何添加一个用户并且让用户获得root权限

1、添加用户,首先用adduser命令添加一个普通用户,命令如下: #adduser tommy //添加一个名为tommy的用户 #passwd tommy //修改密码 Changing password for user tommy. New UNIX password: //在这里输入新密码 Retype new UNIX password: //...