mplayer権限

mplayer権限

mplayerを使用してフレームバッファから直接ビデオを再生しようとしています。現時点では、同じランレベルでオーディオとビデオを再生することはできません。

ユーザーレベルの場合にのみオーディオデバイスが接続され、ビデオデバイスは拒否されます。

たとえば、次のように実行できます。

  mplayer -ao alsa -vo fbdev2 test.mp4

オーディオは再生されますが、ビデオ接続は拒否されます。

 can't open /dev/fb0: Permission Denied

使用するとsudo mplayer -ao alsa -vo fbdev2 test.mp4ビデオは再生されますが、オーディオは再生されません。

 [AO_ALSA] alsa-lib: pulse.c:243:(pulse_connect) PulseAudio: Unable to connect: Connection Refused
 [AO_ALSA] Playback open error: Connection Refused
 Failed to initialize audio driver 'alsa'
 Could not open/initialize audio device -> no sound
 Audio: no sound

オーディオとビデオを一緒に再生するには?それらはすべて異なる実行レベルで個別に機能します。

ベストアンサー1

短い答えは、ルート常駐仮想コンソール(Ctrl + Alt + Nなど)を使用してログインし、pulseaudioデーモンを起動してビデオを再生します。

 /usr/bin/pulseaudio --start
 mplayer -vo fbdev2 test.mp4

[重要]/usr/bin/pulseaudio --systemここで試す必要はありません。あなたはすべての手順を実行するには、ルート(sudoまたはsuではない)と仮想コンソールに常駐する必要があります。デーモンの起動とビデオの再生が含まれます。効果なしsuXセッションの仮想端末内でデーモンを起動しようとしている場合。

長い答え、私が見つけた方法:

最初のステップは、新しい仮想コンソールを使用して新しい端末を開くことです。これは、Xセッションがフレームバッファで動作しない可能性が高いためです。

今mplayerに限定されているかどうかを知る必要があります。だから私は組み込みkdeサウンドのような基本的な音楽を再生するためにplayコマンドを使用し、play /usr/share/sounds/KDE-Im-Cant-Connect.ogg新しい仮想コンソールでsudoを試しました。

$ sudo play /usr/share/sounds/KDE-Im-Cant-Connect.ogg
ALSA lib pulse.c:243:(pulse_connect) PulseAudio: Unable to connect: Connection refused

play FAIL formats: can't open output file `default': snd_pcm_open error: Connection refused
$

mplayerや複雑な曲に限定されません。

今、私たちは違いを調べる必要があります。騒音があります。そして音が出ない。一般ユーザーのためのXセッションでstrace(サウンドを含む)を試してみましょう。 (ここでファイル名su1.logには誤解があり、suとは何の関係もありません。)

strace -o /tmp/su1.log -v -s 1000000 再生 /usr/share/sounds/KDE-Im-Cant-Connect.ogg

と仮想コンソール(音なし):

strace -o /tmp/su2.log -v -s 1000000 再生 /usr/share/sounds/KDE-Im-Cant-Connect.ogg

vi /tmp/su2.log、最後に移動:

connect(8, {sa_family=AF_LOCAL, sun_path="/run/user/0/pulse/native"}, 110) = -1 ENOENT (No such file or directory)
close(8)                                = 0
socket(PF_LOCAL, SOCK_STREAM|SOCK_CLOEXEC, 0) = 8
fcntl(8, F_GETFD)                       = 0x1 (flags FD_CLOEXEC)
setsockopt(8, SOL_SOCKET, SO_PRIORITY, [6], 4) = 0
fcntl(8, F_GETFL)                       = 0x2 (flags O_RDWR)
fcntl(8, F_SETFL, O_RDWR|O_NONBLOCK)    = 0
connect(8, {sa_family=AF_LOCAL, sun_path="/var/run/pulse/native"}, 110) = -1 ENOENT (No such file or directory)
close(8)                                = 0
write(5, "x", 1)                        = 1
write(2, "ALSA lib pulse.c:243:(pulse_connect) ", 37) = 37
write(2, "PulseAudio: Unable to connect: Connection refused\n", 50) = 50
write(2, "\n", 1)                       = 1
futex(0x135a8e0, FUTEX_UNLOCK_PI_PRIVATE, 0) = 0
sendto(7, "W", 1, MSG_NOSIGNAL, NULL, 0) = -1 ENOTSOCK (Socket operation on non-socket)
write(7, "W", 1)                        = 1
futex(0x135a8e0, FUTEX_UNLOCK_PI_PRIVATE, 0) = 0
futex(0x7f34065089d0, FUTEX_WAIT, 7956, NULL) = -1 EAGAIN (Resource temporarily unavailable)
munmap(0x7f3406509000, 67112960)        = 0
unlink("/dev/shm/pulse-shm-3719764676") = 0
close(6)                                = 0
close(7)                                = 0
close(5)                                = 0
close(4)                                = 0
write(2, "play FAIL formats: ", 19)     = 19
write(2, "can't open output file `default': snd_pcm_open error: Connection refused", 72) = 72
write(2, "\n", 1)                       = 1

両方のログの「open(」」を比較するkdiff3もあります。

$ grep 'open(' /tmp/su1.log > /tmp/su1_open.log 
$ grep 'open(' /tmp/su2.log > /tmp/su2_open.log
$ kdiff3 /tmp/su1_open.log /tmp/su2_open.log 
$ 

ここに画像の説明を入力してください。

次の状況では若干異なります。/実行/ユーザー/0/パルスこれで、uid 1000(一般ユーザー)と0(root)で何かを実装しました。ここで、「/run/user/1000/pulse」および「run/user/0/pulse」は、それぞれuid 1000と0を使用する場合にのみ要求されます。

$ grep 'run/user/0/pulse' /tmp/su1.log
$ grep 'run/user/1000/pulse' /tmp/su2.log
$ grep 'run/user/1000/pulse' /tmp/su1.log
recvmsg(5, {msg_name(0)=NULL, msg_iov(1)=[{"\1\10\2\0\21\0\0\0\37\0\0\0\0\0\0\0B\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0{34959d136592433aad171659a5cd523f}unix:/run/user/1000/pulse/native\0\0", 4096}], msg_controllen=0, msg_flags=0}, 0) = 100
connect(5, {sa_family=AF_LOCAL, sun_path="/run/user/1000/pulse/native"}, 110) = 0
recvmsg(6, {msg_name(0)=NULL, msg_iov(1)=[{"\1\10\2\0\21\0\0\0\37\0\0\0\0\0\0\0B\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0{34959d136592433aad171659a5cd523f}unix:/run/user/1000/pulse/native\0\0", 4096}], msg_controllen=0, msg_flags=0}, 0) = 100
connect(6, {sa_family=AF_LOCAL, sun_path="/run/user/1000/pulse/native"}, 110) = 0
$ grep 'run/user/0/pulse' /tmp/su2.log
mkdir("/run/user/0/pulse", 0700)        = -1 EEXIST (File exists)
open("/run/user/0/pulse", O_RDONLY|O_NOCTTY|O_NOFOLLOW|O_CLOEXEC) = 5
lstat("/run/user/0/pulse", {st_dev=makedev(0, 41), st_ino=86867, st_mode=S_IFDIR|0700, st_nlink=2, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=0, st_size=40, st_atime=2015/07/22-01:44:45, st_mtime=2015/07/22-01:44:45, st_ctime=2015/07/22-01:47:59}) = 0
lstat("/run/user/0/pulse", {st_dev=makedev(0, 41), st_ino=86867, st_mode=S_IFDIR|0700, st_nlink=2, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=0, st_size=40, st_atime=2015/07/22-01:44:45, st_mtime=2015/07/22-01:44:45, st_ctime=2015/07/22-01:47:59}) = 0
connect(5, {sa_family=AF_LOCAL, sun_path="/run/user/0/pulse/native"}, 110) = -1 ENOENT (No such file or directory)
mkdir("/run/user/0/pulse", 0700)        = -1 EEXIST (File exists)
open("/run/user/0/pulse", O_RDONLY|O_NOCTTY|O_NOFOLLOW|O_CLOEXEC) = 8
lstat("/run/user/0/pulse", {st_dev=makedev(0, 41), st_ino=86867, st_mode=S_IFDIR|0700, st_nlink=2, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=0, st_size=40, st_atime=2015/07/22-01:44:45, st_mtime=2015/07/22-01:44:45, st_ctime=2015/07/22-01:47:59}) = 0
lstat("/run/user/0/pulse", {st_dev=makedev(0, 41), st_ino=86867, st_mode=S_IFDIR|0700, st_nlink=2, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=0, st_size=40, st_atime=2015/07/22-01:44:45, st_mtime=2015/07/22-01:44:45, st_ctime=2015/07/22-01:47:59}) = 0
connect(8, {sa_family=AF_LOCAL, sun_path="/run/user/0/pulse/native"}, 110) = -1 ENOENT (No such file or directory)
$ 

/run/user/0/pulseの場合にのみ「該当ファイルやディレクトリがありません」と表示されたら確認しましょう(rootを使用)。

# l /run/user/0/pulse/
total 0
84490 drwx------. 4 root root 80 Jul 22 01:44 ..
86867 drwx------. 2 root root 40 Jul 22 01:44 .
#
# l /run/user/1000/pulse/
total 4.0K
29328 -rw-------.  1 xiaobai xiaobai   5 Jul 22 00:58 pid
30544 srwxrwxrwx.  1 xiaobai xiaobai   0 Jul 22 00:58 native
31058 drwx------.  2 xiaobai xiaobai  80 Jul 22 00:58 .
27430 drwx------. 14 xiaobai xiaobai 280 Jul 22 01:06 ..
# l /run/user/1000/pulse/native 
30544 srwxrwxrwx. 1 xiaobai xiaobai 0 Jul 22 00:58 /run/user/1000/pulse/native
# file /run/user/1000/pulse/native     
/run/user/1000/pulse/native: socket
# file /run/user/1000/pulse/pid 
/run/user/1000/pulse/pid: ASCII text
# cat /run/user/1000/pulse/pid     
2205
#

私はこの時を知っていますプロセス番号2205実行中で正しく機能するには、uid 0として存在する必要があります。

Googleで見つけました。パルスオーディオ - 確認:

# pulseaudio --check

arg verboseを試してみました!デーモンは次のように実行されます。プロセス番号2205、上記で観察した内容を証明します。

# pulseaudio --check -v
I: [pulseaudio] main.c: Daemon running as PID 2205
#

今、私はパルスオーディオが効果を発揮できると信じています。 PID 2205をチェックして、どのようにトリガーされたかを確認してください。

# ps aux|grep 2205
xiaobai   2205  0.0  0.2 565980 11080 ?        S<l  00:58   0:01 /usr/bin/pulseaudio --start
root      8747  0.0  0.0 113008  2300 pts/2    S+   01:58   0:00 grep --color=auto 2205
#

それでは一度試してみましょう/usr/bin/pulseaudio --start

#  /usr/bin/pulseaudio --start
W: [pulseaudio] main.c: This program is not intended to be run as root (unless --system is specified).
N: [pulseaudio] main.c: User-configured server at {34959d136592433aad171659a5cd523f}unix:/run/user/1000/pulse/native, which appears to be local. Probing deeper.

これで、新しいpulseディレクトリがuid 0の下に新しいpidで表示されます。

# l /run/user/0/
total 0
17794 drwxr-xr-x. 4 root root 80 Jul 22 01:44 ..
85629 drwxr-xr-x. 2 root root 80 Jul 22 01:44 systemd
84490 drwx------. 4 root root 80 Jul 22 01:44 .
86867 drwx------. 2 root root 80 Jul 22 02:02 pulse
# cat /run/user/0/pulse/pid 
9731
# 

ついに音が働きます。今自分で試してみてください。mplayer -vo fbdev2 test.mp4

[注]su奇妙な状況では動作することがあります。たとえば、Xセッション11 - > Ctrl + Alt + 2 - > uid 1000でログイン - > su - root - >/usr/bin/pulseaudio --startとmplayer -vo fbdev2が正常に動作します。その後、Ctrl + Alt + 3 - > rootとしてログイン - > /usr/bin/pulseaudio --startmplayerで作業 - > Ctrl + Alt + 2に戻る - >仮想コンソール2のmplayerが機能しなくなりました。

おすすめ記事