広告

[Ubuntu] オーディオデバイス番号を固定化する

2018-02-03

!!! 半年以上も前に書かれた古い情報です !!!
!!! 半年以上も前に書かれた古い情報です !!!
!!! 半年以上も前に書かれた古い情報です !!!
!!! 半年以上も前に書かれた古い情報です !!!
!!! 半年以上も前に書かれた古い情報です !!!

環境

Ubuntu 12.04.2 (64bit) (3.5.0-24-generic)
FFmpeg 各バージョン
Logicool HD Pro Webcam C910

UVC 対応の USBカメラのオーディオデバイス番号の固定化

Linux PC が複数のオーディオデバイスを持っている場合,デバイス名を固定する方法をメモしておきます.

例えば,オンボードのサウンドデバイスと USB カメラのマイクという 2 種類のオーディオデバイスがある状態で,常に USB カメラのマイクを FFmpeg でキャプチャしたい場合など

/proc/asound 下に card0, card1 ディレクトリができているのですが,デフォルトだと Linux を起動する度にオーディオデバイスと cardX の割り当て番号 (X は整数) が異なります.(つまり固定化されていない)

まず,Linux 起動時の cardX の割り当て番号を固定化します.

自分の環境でオーディオデバイスの名前を調べてみると

$ cat /proc/asound/modules

下記のように表示されます.

0 snd_hda_intel
1 snd_usb_audio

snd_usb_audio が USB カメラのオーディオデバイス (マイク) になります.
snd_hda_intel というのは恐らくマザーボードのオンボードオーディオデバイス?でしょう.

Linux 起動時に常に USB カメラのオーディオデバイスが card0 とするために下記のファイルを作成して

$ sudo vi /etc/modprobe.d/sound.conf

その内容を下記のようにします.

options snd_usb_audio index=0
options snd_hda_intel index=1

これで常に USB カメラのオーディオデバイスが card0 になります.(多分)

OS を再起動します.

$ sudo reboot

OS 再起動後,再度オーディオデバイスの名前を調べてみると

$ cat /proc/asound/modules

USB カメラのオーディオデバイスが 0 になっていることを確認します.
(用心深い人はデバイス番号を変え、何度も再起動してみるのもよいでしょう)

0 snd_usb_audio
1 snd_hda_intel

補足

オーディオデバイスの情報を確認します.
下記のコマンドを実行してみます.

$ cat /proc/asound/devices

結果を確認します.

  1:        : sequencer
  2: [ 0- 0]: digital audio capture
  3: [ 0]   : control
  4: [ 1- 7]: digital audio playback
  5: [ 1- 3]: digital audio playback
  6: [ 1- 2]: digital audio capture
  7: [ 1- 1]: digital audio playback
  8: [ 1- 0]: digital audio playback
  9: [ 1- 0]: digital audio capture
 10: [ 1- 3]: hardware dependent
 11: [ 1- 0]: hardware dependent
 12: [ 1]   : control
 33:        : timer

2: [ 0- 0]: digital audio capture が USB カメラのオーディオデバイス(マイク) になります.
0 から始まっているのが USB カメラのオーディオデバイス,1 から始まっているのがオンボードのオーディオデバイスでしょう.

続いて下記のコマンドを実行してみます.

$ cat /proc/asound/pcm

結果は下記のようになります.

00-00: USB Audio : USB Audio : capture 1
01-00: ALC892 Analog : ALC892 Analog : playback 1 : capture 1
01-01: ALC892 Digital : ALC892 Digital : playback 1
01-02: ALC892 Analog : ALC892 Analog : capture 1
01-03: HDMI 0 : HDMI 0 : playback 1
01-07: HDMI 1 : HDMI 1 : playback 1

さらに下記のコマンドを実行してみます.

$ cat /proc/asound/card0/pcm0c/info

結果は下記のようになります.

card: 0
device: 0
subdevice: 0
stream: CAPTURE
id: USB Audio
name: USB Audio
subname: subdevice #0
class: 0
subclass: 0
subdevices_count: 1
subdevices_avail: 1

以上から,USB カメラのオーディオデバイスの card は 0, device は 0 ということになります.(恐らく)

よって,FFmpeg で USB カメラのマイクの音声をエンコードする際に設定するオーディオデバイス名は hw:0,0 と固定化することができます.
hw:X,Y において,X は card, Y は device を指すようです.

実際のコマンド例は以下の通りです.

$ ffmpeg -f video4linux2 -s 1280x720 -i /dev/video0 -f alsa -i hw:0,0 -acodec libfaac -ab 128k -ar 44100 -ac 2 -s 960x540 -vcodec libx264 -b:v 1500k -coder 0 -t 3600 -threads 0 -f mpegts out.ts

下記のようなエラーとなる場合,一般ユーザにオーディオデバイスへのアクセス権が与えられていません.

ALSA lib pcm_hw.c:1401:(_snd_pcm_hw_open) Invalid value for card
[alsa @ 0x1217140] cannot open audio device hw:0,0 (No such file or directory)
hw:0,0: Input/output error

そのため,/etc/group を編集します.

$ sudo vi /etc/group

デフォルトで下記のようになっている audio 行に対して、一般ユーザを追記します.

audio:x:29:pulse

例えば下記のようにします.

audio:x:29:pulse,username

編集後,いったんログオフして変更を反映させます.

パラメータの値を hw:0,0 ではなく default としても良さそうです.

$ ffmpeg -f video4linux2 -s 1280x720 -i /dev/video0 -f alsa -i default -acodec libfaac -ab 128k -ar 44100 -ac 2 -s 960x540 -vcodec libx264 -b:v 1500k -coder 0 -t 3600 -threads 0 -f mpegts out.ts

また,録音,キャプチャ可能なオーディオデバイスは arecord コマンドでも確認できます.

$ sudo arecord -l

例えば下記のように表示されます.

**** List of CAPTURE Hardware Devices ****
card 0: U0x46d0x821 [USB Device 0x46d:0x821], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: PCH [HDA Intel PCH], device 0: ALC892 Analog [ALC892 Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: PCH [HDA Intel PCH], device 2: ALC892 Analog [ALC892 Analog]
  Subdevices: 1/1

sudo で実行しないと下記のようになります.

arecord: device_list:252: no soundcards found...

広告

FFmpeg, Ubuntu, UVC

Posted by admin