MPlayerボリューム制御の問題
3933 ワード
開発ボード:mini 2440
オペレーティングシステム:Linux 2.4
IDE:Qt Creator
音楽プレーヤーを作る過程で、MPlayer 10 rc 2をmini 2440開発ボードに移植し、MPlayerが音量の大きさを制御できないことに遭遇し、0と9を使って音量を制御すると、再生する音が0になる.原因分析は次のとおりです.
1,
デフォルトのOSSドライバを使用して再生する場合、ヒント:
2,
ALSAドライバを使用して再生する場合、ヒント:
開発ボードでmini 2440がALSAドライバを構成していることを確認
しかし、以下のコマンドを使用してMPlayer構成のオーディオドライバを表示すると、ALSAドライバは構成されていません.
解析:この問題はMPlayerを構成する際にALSAドライバを追加しなかったのかもしれない.解決策は、MPlayerを再構成、コンパイル、移植することです.
3,
最も直接的な方法は、デバイスファイル/dev/mixerを読み書きしてボリュームを制御することです.コードは以下の通りです.
第3の方法はテストを経て実行可能である
オペレーティングシステム:Linux 2.4
IDE:Qt Creator
音楽プレーヤーを作る過程で、MPlayer 10 rc 2をmini 2440開発ボードに移植し、MPlayerが音量の大きさを制御できないことに遭遇し、0と9を使って音量を制御すると、再生する音が0になる.原因分析は次のとおりです.
1,
デフォルトのOSSドライバを使用して再生する場合、ヒント:
Requested audio codec family [mp3] (afm=mp3lib) not available.
音楽は相変わらず放送されています.「volume 100」を使用して音量を設定すると、設定された音量値にかかわらず、次のようなプロンプトが表示されます.Volume:0%
: 。
2,
ALSAドライバを使用して再生する場合、ヒント:
Could not open/initialize audio device -> no sound.
音楽が再生できません.開発ボードでmini 2440がALSAドライバを構成していることを確認
ALSA device list:
#0: S3C24XX_UDA134X (UDA134X)
しかし、以下のコマンドを使用してMPlayer構成のオーディオドライバを表示すると、ALSAドライバは構成されていません.
[root@FriendlyARM /]# mplayer -ao help
MPlayer 1.0rc2-4.3.2 (C) 2000-2007 MPlayer Team
CPU: ARM
Available audio output drivers:
oss OSS/ioctl audio output
mpegpes DVB audio output
v4l2 V4L2 MPEG Audio Decoder output
null Null audio output
pcm RAW PCM/WAVE file writer audio output
解析:この問題はMPlayerを構成する際にALSAドライバを追加しなかったのかもしれない.解決策は、MPlayerを再構成、コンパイル、移植することです.
3,
最も直接的な方法は、デバイスファイル/dev/mixerを読み書きしてボリュームを制御することです.コードは以下の通りです.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/soundcard.h>
int main(int argc, char* argv[])
{
int set_volume = 0;
int get_volume = 0;
int fd = 0;
int status = 0;
fd = open("/dev/mixer", O_RDWR);
if(fd == -1)
{
printf("open /dev/mixer error!
");
close(fd);
exit(1);
}
//get volume value about system volume
if((argc == 2) && (!(strcmp("get_volume", argv[1]))))
{
status = ioctl(fd, SOUND_MIXER_READ_VOLUME, &get_volume);
if(status == -1)
{
printf("get volume value from /dev/mixer error!
");
exit(1);
}
get_volume = get_volume/257; // 257
printf("get_volume = %d
", get_volume);
close(fd);
return 0;
}
//set volume value to system
else if((argc == 3) && (!(strcmp("set_volume", argv[1]))) &&
(0<=atoi(argv[2])) && (atoi(argv[2])<=100))
{
set_volume = atoi(argv[2]);
status = ioctl(fd, SOUND_MIXER_WRITE_VOLUME, &set_volume);
if(status == -1)
{
printf("write volume value to /dev/mixer error!
");
exit(1);
}
close(fd);
return 0;
}
else
{
printf("Usage:%s set_volume [0~100]
",argv[0]);
printf("Usage:%s get_volume
", argv[0]);
close(fd);
exit(1);
}
}
第3の方法はテストを経て実行可能である