ffmpeg对新手来说可以说是真的难用,太坑了。网上关于推流麦克风设备的多半是Windows环境下的,而Ubuntu下的少之又少,根本没法用,比如Windows下推麦克风的ffmpeg命令是:
ffmpeg -f dshow -i audio="麦克风 (AUDIO 2.0)" -f flv rtmp://192.168.1.***/mylive/test
其中麦克风 (AUDIO 2.0)是设备管理中麦克风的设备名称,但是换到Ubuntu中就说dshow这个命令找不到,这就让人非常爆炸了。幸好群里有大佬告诉我这个链接,才让我找到解决方案。
https://trac.ffmpeg.org/wiki/Capture/ALSA
调试成功的命令行是:
ffmpeg -f alsa -i default -f flv rtmp://192.168.1.***/mylive/test
在Linux中使用alsa来作为输入格式,-i中我最后使用default获取到了USB麦克风设备,当然这个是不一定的,也有可能是其他设备,比如hw:0之类的,我的反正用default就获取到了。之后的-f是输出格式,这里因为要rtmp推流,因此采用了flv,其他格式我试过,推流都报错失败了。最后是rtmp链接参数,指定rtmp服务器的地址。
然后是推送PCM文件,PCM文件的来源是我麦克风通过PyAudio录制到本地的,PCM文件是未经压缩过的音频文件,文件体积非常大,比如我把4.3MB的mp3音频文件转为PCM文件,得到的文件足足有51.4MB!我现在要把PCM推送出去,然后文件就出来了,到底用什么编码器,查了很久的资料才知道ffmpeg命令应该这么写:
ffmpeg -f s16le -ac 2 -ar 44100 -acodec pcm_s16le -i /home/dct/Videos/mp3_441.pcm -f flv rtmp://192.168.1.182/mylive/mp3
其中第一个-f是使用什么格式读取,这里是s16le,-ac的值2代表有两条音轨。-ar的值44100表示采样率是44100Hz,也就是一秒内采样44100次。-acodec的值表示用什么编码器,这里是pcm_s16le,pcm_s16le中的16表示采样位数为16,也就是声音的值可以是0~65535。第二个-f是输出格式,这里因为要rtmp推流,因此采用了flv,其他格式我试过,推流都报错失败了。最后是rtmp链接参数,指定rtmp服务器的地址。