QEMU下虚拟机内的声卡模拟方法总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hubbybob1/article/details/77199567

转载请注明:http://blog.csdn.net/hubbybob1/article/details/77199567
在做VAG或者USB穿透的过程中如果声卡和网卡在同一个分组内,那么就不适合穿透声卡了,那么就需要模拟声卡来试用了,一步一步来介绍吧

一,虚拟机内部声音导出到本地宿主机内

主要是针对qemu虚拟机下的音频如何使用,首先要查看help命令:

qemu-system-x86_64 -audio-help

这个命令能告诉我们audio的一些基本的信息和使用方法,以及Qemu支持的驱动

Audio options:
  QEMU_AUDIO_DAC_FIXED_SETTINGS: boolean, default = 1
    Use fixed settings for host DAC
  QEMU_AUDIO_DAC_FIXED_FREQ: integer, default = 44100
    Frequency for fixed host DAC
  QEMU_AUDIO_DAC_FIXED_FMT: format, default = S16, (one of: U8 S8 U16 S16 U32 S32)
    Format for fixed host DAC
  QEMU_AUDIO_DAC_FIXED_CHANNELS: integer, default = 2
    Number of channels for fixed DAC (1 - mono, 2 - stereo)
  QEMU_AUDIO_DAC_VOICES: integer, default = 1
    Number of voices for DAC
  QEMU_AUDIO_DAC_TRY_POLL: boolean, default = 1
    Attempt using poll mode for DAC
  QEMU_AUDIO_ADC_FIXED_SETTINGS: boolean, default = 1
    Use fixed settings for host ADC
  QEMU_AUDIO_ADC_FIXED_FREQ: integer, default = 44100
    Frequency for fixed host ADC
  QEMU_AUDIO_ADC_FIXED_FMT: format, default = S16, (one of: U8 S8 U16 S16 U32 S32)
    Format for fixed host ADC
  QEMU_AUDIO_ADC_FIXED_CHANNELS: integer, default = 2
    Number of channels for fixed ADC (1 - mono, 2 - stereo)
  QEMU_AUDIO_ADC_VOICES: integer, default = 1
    Number of voices for ADC
  QEMU_AUDIO_ADC_TRY_POLL: boolean, default = 1
    Attempt using poll mode for ADC
  QEMU_AUDIO_TIMER_PERIOD: integer, default = 100
    Timer period in HZ (0 - use lowest possible)

Available drivers:
Name: spice
Description: spice audio driver
One playback voice
One capture voice
Options:

Name: oss
Description: OSS http://www.opensound.com
Theoretically supports many playback voices
Theoretically supports many capture voices
Options:
  QEMU_OSS_FRAGSIZE: integer, default = 4096
    Fragment size in bytes
  QEMU_OSS_NFRAGS: integer, default = 4
    Number of fragments
  QEMU_OSS_MMAP: boolean, default = 0
    Try using memory mapped access
  QEMU_OSS_DAC_DEV: string, default = /dev/dsp
    Path to DAC device
  QEMU_OSS_ADC_DEV: string, default = /dev/dsp
    Path to ADC device
  QEMU_OSS_EXCLUSIVE: boolean, default = 0
    Open device in exclusive mode (vmix won't work)

Name: alsa
Description: ALSA http://www.alsa-project.org
Theoretically supports many playback voices
Theoretically supports many capture voices
Options:
  QEMU_ALSA_DAC_SIZE_IN_USEC: boolean, default = 0
    DAC period/buffer size in microseconds (otherwise in frames)
  QEMU_ALSA_DAC_PERIOD_SIZE: integer, default = 1024
    DAC period size (0 to go with system default)
  QEMU_ALSA_DAC_BUFFER_SIZE: integer, default = 4096
    DAC buffer size (0 to go with system default)
  QEMU_ALSA_ADC_SIZE_IN_USEC: boolean, default = 0
    ADC period/buffer size in microseconds (otherwise in frames)
  QEMU_ALSA_ADC_PERIOD_SIZE: integer, default = 0
    ADC period size (0 to go with system default)
  QEMU_ALSA_ADC_BUFFER_SIZE: integer, default = 0
    ADC buffer size (0 to go with system default)
  QEMU_ALSA_THRESHOLD: integer, default = 0
    (undocumented)
  QEMU_ALSA_DAC_DEV: string, default = default
    DAC device name (for instance dmix)
  QEMU_ALSA_ADC_DEV: string, default = default
    ADC device name

Name: sdl
Description: SDL http://www.libsdl.org
One playback voice
Does not support capture
Options:
  QEMU_SDL_SAMPLES: integer, default = 1024
    Size of SDL buffer in samples

Name: none
Description: Timer based audio emulation
Theoretically supports many playback voices
Theoretically supports many capture voices
No options

Name: wav
Description: WAV renderer http://wikipedia.org/wiki/WAV
One playback voice
Does not support capture
Options:
  QEMU_WAV_FREQUENCY: integer, default = 44100
    Frequency
  QEMU_WAV_FORMAT: format, default = S16, (one of: U8 S8 U16 S16 U32 S32)
    Format
  QEMU_WAV_DAC_FIXED_CHANNELS: integer, default = 2
    Number of channels (1 - mono, 2 - stereo)
  QEMU_WAV_PATH: string, default = qemu.wav
    Path to wave file

Options are settable through environment variables.
Example:
  export QEMU_AUDIO_DRV=wav
  export QEMU_WAV_PATH=$HOME/tune.wav
(for csh replace export with setenv in the above)
  qemu ...

可以看到audio的很多操作,也可以设置Audio的参数,通过export来设置,我们可以看到,支持的驱动有spice,oss,alsa,sdl, none, wav,每种驱动都给出了相应的操作方法,并且还给出了Example:
如果你是本地启动虚拟机二没有通过远程spice连接的话那么可以如下:

#在启动qemu虚拟机命令前执行,修改下面的环境变量
export QEMU_AUDIO_DRV=wav #audio的驱动方式为wav
export QEMU_WAV_PATH=$HOME/tune.wav #把所有虚拟机下的声音存储到tune.wav内,$HOME改写为你的绝对路径如:/home/tune.wav

这样你的所有在虚拟机下的声音统统都导入到了你的宿主机的文件内了,这个方法缺点是是无法在虚拟机内真正的发出声音或者录音,只有通过本地打开的wav文件才能收听。

二.通过soundhw来模拟声卡

这个方法也很简单,首先就是查看支持的驱动

qemu-system-x86_64 -soundhw ? #查看支持的驱动

查看结果如下:
这里写图片描述
可以看到支持的驱动有ac97,hda等,我们使用ac97或者hda,或者all,all是最好的就是使能所有的驱动,使用的方式如下:

在你的启动qemu-system-x86_64的命令参数内加上下面任意一个就可以了
-soundhw ac97 #或者
-soundhw hda #或者
-soundhw all

三.使用device添加模拟设备

如果你做了一些穿透的工作如,VGA或者usb的穿透,那么上面的方法二就无法使用了,因为会报如下错误,说PCI已经被使用了,无法使用,因此上面的方法是没办法使用的,如下图所示:

这里写图片描述

因此我们只能使用-device这个参数来模拟了
要想使用这种方法来模拟,必须对qemu这个库进行重新配置编译,编译的选项如下

./configure  --target-list=x86_64-softmmu --enable-kvm \
--enable-gtk --with-gtkabi=3.0 --enable-virtfs \
--enable-tcg-interpreter --enable-xfsctl \
--enable-libiscsi --enable-glusterfs --enable-snappy \
--enable-lzo --enable-rdma --enable-linux-aio \
--enable-vhost-net --enable-spice --enable-smartcard  \
--enable-libusb --enable-usb-redir --enable-guest-agent  \
--enable-libssh2 \
--enable-sdl --audio-drv-list='oss alsa sdl' 

看到最后一行,就是我们需要的,添加上audio驱动列表audio-drv-list,配置结果可以查看到下图:
这里写图片描述
使能了sdl和audio 驱动列表。
接下来我们就可以通过-device来查询支持的设备了,查询命令如下:

qemu-system-x86_64 -device ? #查询支持添加的设备

我们在打印出的很多内容中找到Hub devices,USB devices ,Storage devices ,Network devices , Input devices , Display devices , Sound devices , Misc devices , CPU devices , Uncategorized devices ,而我们只需要查看Sound devices如下:
这里写图片描述
因此我们只需要在qemu启动虚拟机的命令内添加参数如下:

-device AC97 #这个驱动效果是做好的
-device intel-hda #这个效果很不好
-device usb-audio #这个下过没测试过

那么我们在运行qemu启动虚拟机命令是会报出一个错误

#在使用的过程中默认使用oss但是启动脚本是会报错:无法初始化OSS
audio: Could not init `oss' audio driver

这个错误无关紧要,不会影响模拟的效果,但是看着就不爽,下面就是解决方法:

# 修改驱动为alsa就可以了
export QEMU_AUDIO_DRV=alsa

到此声卡的模拟也就总结完毕了

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试