SoundVolumeView

中国机械与配件网2200

本篇文章给大家谈谈SoundVolumeView,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

java编写的音乐播放器如何让进度条和音乐关联起来 点击进度条的指定位置 音乐就从指定位置开始播放

//变量:

private SeekBar seekbar;

private MediaPlayer player = null;

player = new MediaPlayer();//初始化

seekbar.setMax(player.getDuration());//设进度条显示

//音量:

audioManager=(AudioManager)getSystemService(AUDIO_SERVICE);

int MaxSound=audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);

maxVolumeTextView.setText(String.valueOf(MaxSound));

SoundseekBar.setMax(MaxSound);

int currentSount=audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);

SoundseekBar.setProgress(currentSount);

SoundseekBar.setOnSeekBarChangeListener(new SeekBarListener());

ProceseekBar2.setOnSeekBarChangeListener(new ProcessBarListener());

iOS 播放器静音设置方法(介绍:整理的两种设置播放器播放静音的方法)

一、MPVolumeView-设置音量值为0

1.获取到当前系统音量值(恢复音量时有用)

volumeFloat =[selfgetVolume];-(float) getVolume

{

    //获取系统系统音量视图    MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame: CGRectMake(-1000, -100, 100, 100)];

    volumeView.hidden =NO;//不显示系统音量调节视图[selfaddSubview:volumeView];    volumeViewSlider=nil;for(UIView *view in [volumeView subviews])

    {

        if([[[view class] description] isEqualToString:@"MPVolumeSlider"])

        {

            volumeViewSlider=(UISlider *)view;

            break;

        }

    }

    float val = [volumeViewSlider value];

    return val;

}

2.关闭系统音量(设置音量值为0)

//关闭系统音量(静音)

-(void)closeSysVolume{

[volumeViewSlider setValue:0 animated:NO];

}

3.恢复原来的音量

-(void)reStartSysVolume

{

NSLog(@"重启音量");

    if(volumeFloat ==0) {

        volumeFloat =0.5;    }    [volumeViewSlider setValue:volumeFloat animated:NO];//注:设置恢复后不会影响系统音量图标的正常显示MPVolumeView*volumeView = [MPVolumeViewnew];

    volumeView.hidden =YES;

}

二、AVAudioSession

1.静音

//关闭系统音量(静音)

-(void)closeSysVolume{

[[AVAudioSession sharedInstance]setCategory:AVAudioSessionCategoryRecorderror:nil];

}

2.重新开启音量(注:调用closeSysVolume后使用该方法无效--还没找到恢复音量方法)

-(void)reStartSysVolume{

NSLog(@"重启音量");[[AVAudioSession sharedInstance]setCategory:AVAudioSessionCategoryAmbienterror:nil];

}

三、补充

如果不想通过设置系统方式静音,可以更简单的使用播放器自带的音量属性实现静音(推荐这种方式,而不是使用修改系统方式)。例如ijkplayer的playbackVolume属性:

//关闭音量(静音)

-(void)closeSysVolume{

NSLog(@"静音模式");self.player.playbackVolume= 0;

}

//重启音量

-(void)reStartSysVolume{

NSLog(@"重启音量");self.player.playbackVolume= 1;

}

参考来源

SOUND VOLUME 是什么?

SOUND VOLUME是声音的音量,一般在一些影音设备上面或者遥控器上面调节声音的功能。

音量:又称响度、音强,是指人耳对所听到的声音大小强弱的主观感受,其客观评价尺度是声音的振幅大小。这种感受源自物体振动时所产生的压力,即声压。物体振动通过不同的介质,将其振动能量传导开去。人们为了对声音的感受量化成可以监测的指标,就把声压分成“级”——声压级,以便能客观的表示声音的强弱,其单位称为“分贝”(dB)。

电视盒源码输出怎么还好控制音量呢

要控制电视盒的音量,可以使用电视盒遥控器或者通过遥控App来控制。如果你想在代码中控制电视盒的音量,可以根据你的设备和操作系统来选择相应的方法。

如果你使用的是Android操作系统,你可以使用AudioManager类来控制音量。以下是一个简单的示例:

```java

AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

// 获取当前音量

int currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);

// 设置音量

audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, desiredVolume, 0);

```

其中,`AudioManager.STREAM_MUSIC`表示音量控制的音频流类型,`desiredVolume`表示所需音量大小,第三个参数为设置音量时是否显示系统默认的音量UI。你可以根据需要来调整这些参数。

如果你使用的是iOS操作系统,那么你可以使用AVAudioSession和MPVolumeView类来控制音量。下面是一个简单的示例:

```swift

import AVFoundation

import MediaPlayer

// 获取音频会话

let session = AVAudioSession.sharedInstance()

// 获取音量视图

let volumeView = MPVolumeView(frame: .zero)

// 设置音量

session.setActive(true, options: .notifyOthersOnDeactivation)

volumeView.setVolume(desiredVolume)

```

在这个示例中,`AVAudioSession.sharedInstance()`返回当前音频会话,`MPVolumeView`是一个系统提供的音量UI组件,可以用来控制音量。你可以使用该组件的`setVolume(_:)`方法来设置音量。

需要注意的是,不同的设备和操作系统版本可能会有所不同,如果你遇到问题,可以查阅相关的开发文档或咨询相关的开发者社区获取帮助。

英雄无敌3 win7怎么运行

win7有32位和64位两种,如果游戏无法启动,主要的解决方法有两种:

1、导入注册表文件;

2、设置运行在兼容模式下;

这里主要讲第一种,第二种其实很简单,右键点“heroes3.exe”,出来的菜单中就有“兼容性”这一项。然后设置就可以了。

一般绿色的英雄无敌3都提供一个需要导入的“reg”文件,但这个文件是32位机用的,在64位win7下必须修改下才能用。

32位的reg文件如下:

REGEDIT4

[HKEY_LOCAL_MACHINE\Software\New World Computing]

[HKEY_LOCAL_MACHINE\Software\New World Computing\Heroes of Might and Magic?III]

[HKEY_LOCAL_MACHINE\Software\New World Computing\Heroes of Might and Magic?III\1.0]

"AppPath"=".\"

"CDDrive"=".\"

"Show Intro"=dword:00000001

"Music Volume"=dword:00000005

"Sound Volume"=dword:00000000

"Last Music Volume"=dword:00000005

"Last Sound Volume"=dword:00000000

"Walk Speed"=dword:00000002

"Computer Walk Speed"=dword:00000003

"Show Route"=dword:00000001

"Move Reminder"=dword:00000001

"Quick Combat"=dword:00000000

"Video Subtitles"=dword:00000001

"Town Outlines"=dword:00000001

"Animate SpellBook"=dword:00000001

"Window Scroll Speed"=dword:00000001

"Bink Video"=dword:00000001

"Blackout Computer"=dword:00000000

"First Time"=dword:00000000

"Test Decomp"=dword:0000000f

"Test Read"=dword:00000002

"Test Blit"=dword:00000008

"Unique System ID"="B0Q"

"Network Default Name"="Player"

"Autosave"=dword:00000001

"Show Combat Grid"=dword:00000000

"Show Combat Mouse Hex"=dword:00000000

"Combat Shade Level"=dword:00000000

"Combat Army Info Level"=dword:00000000

"Combat Auto Creatures"=dword:00000001

"Combat Auto Spells"=dword:00000001

"Combat Catapult"=dword:00000001

"Combat Ballista"=dword:00000001

"Combat First Aid Tent"=dword:00000001

"Combat Speed"=dword:00000000

"Main Game Show Menu"=dword:00000001

"Main Game X"=dword:00000000

"Main Game Y"=dword:00000000

"Main Game Full Screen"=dword:00000001

[HKEY_LOCAL_MACHINE\Software\New World Computing\Heroes of Might and Magic(TM) III Armageddon's Blade]

[HKEY_LOCAL_MACHINE\Software\New World Computing\Heroes of Might and Magic(TM) III Armageddon's Blade\1.0]

"AppPath"=".\"

"CDDrive"=".\"

64位的reg文件如下:

REGEDIT4

[HKEY_LOCAL_MACHINE\Software\Wow6432Node\New World Computing]

[HKEY_LOCAL_MACHINE\Software\Wow6432Node\New World Computing\Heroes of Might and Magic?III]

[HKEY_LOCAL_MACHINE\Software\Wow6432Node\New World Computing\Heroes of Might and Magic?III\1.0]

"AppPath"=".\"

"CDDrive"=".\"

"Show Intro"=dword:00000001

"Music Volume"=dword:00000005

"Sound Volume"=dword:00000000

"Last Music Volume"=dword:00000005

"Last Sound Volume"=dword:00000000

"Walk Speed"=dword:00000002

"Computer Walk Speed"=dword:00000003

"Show Route"=dword:00000001

"Move Reminder"=dword:00000001

"Quick Combat"=dword:00000000

"Video Subtitles"=dword:00000001

"Town Outlines"=dword:00000001

"Animate SpellBook"=dword:00000001

"Window Scroll Speed"=dword:00000001

"Bink Video"=dword:00000001

"Blackout Computer"=dword:00000000

"First Time"=dword:00000000

"Test Decomp"=dword:0000000f

"Test Read"=dword:00000002

"Test Blit"=dword:00000008

"Unique System ID"="B0Q"

"Network Default Name"="Player"

"Autosave"=dword:00000001

"Show Combat Grid"=dword:00000000

"Show Combat Mouse Hex"=dword:00000000

"Combat Shade Level"=dword:00000000

"Combat Army Info Level"=dword:00000000

"Combat Auto Creatures"=dword:00000001

"Combat Auto Spells"=dword:00000001

"Combat Catapult"=dword:00000001

"Combat Ballista"=dword:00000001

"Combat First Aid Tent"=dword:00000001

"Combat Speed"=dword:00000000

"Main Game Show Menu"=dword:00000001

"Main Game X"=dword:00000000

"Main Game Y"=dword:00000000

"Main Game Full Screen"=dword:00000001

[HKEY_LOCAL_MACHINE\Software\New World Computing\Heroes of Might and Magic(TM) III Armageddon's Blade]

[HKEY_LOCAL_MACHINE\Software\New World Computing\Heroes of Might and Magic(TM) III Armageddon's Blade\1.0]

"AppPath"=".\"

"CDDrive"=".\"

观察了下,就是把大部分的值写入了“Wow6432Node”下,从名字上看,应该是为了在64位系统上兼容32位应用弄的。

系统为win7 64位版,导入64位注册表后,heroes3就能顺利运行了。

在iOS中绘制录音音频波形图

效果图

条状波形图

线状波形图

配置AvAudioSession

绘制波形图前首先需要配置好AVAudioSession,同时需要建立一个数组去保存音量数据。

相关属性

recorderSetting用于设定录音音质等相关数据。

timer以及updateFequency用于定时更新波形图。

soundMeter和soundMeterCount用于保存音量表数组。

recordTime用于记录录音时间,可以用于判断录音时间是否达到要求等进一波需求。

/// 录音器

private var recorder: AVAudioRecorder!    /// 录音器设置

private let recorderSetting = [AVSampleRateKey : NSNumber(value: Float(44100.0)),//声音采样率

AVFormatIDKey : NSNumber(value: Int32(kAudioFormatMPEG4AAC)),//编码格式

AVNumberOfChannelsKey : NSNumber(value: 1),//采集音轨

AVEncoderAudioQualityKey : NSNumber(value: Int32(AVAudioQuality.medium.rawValue))]//声音质量

/// 录音计时器

private var timer: Timer?    /// 波形更新间隔

private let updateFequency = 0.05

/// 声音数据数组

private var soundMeters: [Float]!    /// 声音数据数组容量

private let soundMeterCount = 10

/// 录音时间

private var recordTime = 0.00

AvAudioSession相关配置

configAVAudioSession用于配置AVAudioSession,其中AVAudioSessionCategoryRecord是代表仅仅利用这个session进行录音操作,而需要播放操作的话是可以设置成AVAudioSessionCategoryPlayAndRecord或AVAudioSessionCategoryPlayBlack,两者区别一个是可以录音和播放,另一个是可以在后台播放(即静音后仍然可以播放语音)。

configRecord是用于配置整个AVAudioRecoder,包括权限获取、代理源设置、是否记录音量表等。

directoryURL是用于配置文件保存地址。

private func configAVAudioSession() {        let session = AVAudioSession.sharedInstance()        do { try session.setCategory(AVAudioSessionCategoryPlayAndRecord, with: .defaultToSpeaker) }        catch { print("session config failed") }

}   

private func configRecord() {        AVAudioSession.sharedInstance().requestRecordPermission { (allowed) in

if !allowed {                return

}

}        let session = AVAudioSession.sharedInstance()        do { try session.setCategory(AVAudioSessionCategoryPlayAndRecord, with: .defaultToSpeaker) }        catch { print("session config failed") }        do {            self.recorder = try AVAudioRecorder(url: self.directoryURL()!, settings: self.recorderSetting)            self.recorder.delegate = self

self.recorder.prepareToRecord()            self.recorder.isMeteringEnabled = true

} catch {            print(error.localizedDescription)

}        do { try AVAudioSession.sharedInstance().setActive(true) }        catch { print("session active failed") }

}   

private func directoryURL() - URL? {        // do something ...

return soundFileURL

}

记录音频数据

在开始录音后,利用我们刚刚配置的定时器不断获取averagePower,并保存到数组之中。

updateMeters被定时器调用,不断将recorder中记录的音量数据保存到soundMeter数组中。

addSoundMeter用于完成添加数据的工作。

private func updateMeters() {

recorder.updateMeters()

recordTime += updateFequency

addSoundMeter(item: recorder.averagePower(forChannel: 0))

}   

private func addSoundMeter(item: Float) {        if soundMeters.count soundMeterCount {

soundMeters.append(item)

} else {            for (index, _) in soundMeters.enumerated() {                if index soundMeterCount - 1 {

soundMeters[index] = soundMeters[index + 1]

}

}            // 插入新数据

soundMeters[soundMeterCount - 1] = item            NotificationCenter.default.post(name: NSNotification.Name.init("updateMeters"), object: soundMeters)

}

}

开始绘制波形图

现在我们已经获取了我们需要的所有数据,可以开始绘制波形图了。这时候让我们转到MCVolumeView.swift文件中,在上一个步骤中,我们发送了一条叫做updateMeters的通知,目的就是为了通知MCVolumeView进行波形图的更新。

override init(frame: CGRect) {        super.init(frame: frame)

backgroundColor = UIColor.clear

contentMode = .redraw  //内容模式为重绘,因为需要多次重复绘制音量表

NotificationCenter.default.addObserver(self, selector: #selector(updateView(notice:)), name: NSNotification.Name.init("updateMeters"), object: nil)

}   

@objc private func updateView(notice: Notification) {

soundMeters = notice.object as! [Float]

setNeedsDisplay()

}

当setNeedsDisplay被调用之后,就会调用drawRect方法,在这里我们可以进行绘制波形图的操作。

noVoice和maxVolume是用于确保声音的显示范围

波形图的绘制使用CGContext进行绘制,当然也可以使用UIBezierPath进行绘制。

override func draw(_ rect: CGRect) {        if soundMeters != nil soundMeters.count 0 {            let context = UIGraphicsGetCurrentContext()

context?.setLineCap(.round)

context?.setLineJoin(.round)

context?.setStrokeColor(UIColor.white.cgColor)           

let noVoice = -46.0 // 该值代表低于-46.0的声音都认为无声音

let maxVolume = 55.0 // 该值代表最高声音为55.0

// draw the volume...           

context?.strokePath()

}

}

柱状波形图的绘制

根据maxVolume和noVoice计算出每一条柱状的高度,并移动context所在的点进行绘制

另外需要注意的是CGContext中坐标点时反转的,所以在进行计算时需要将坐标轴进行反转来计算。

case .bar:         

context?.setLineWidth(3)      for (index,item) in soundMeters.enumerated() {        let barHeight = maxVolume - (Double(item) - noVoice)    //通过当前声音表计算应该显示的声音表高度

context?.move(to: CGPoint(x: index * 6 + 3, y: 40))

context?.addLine(to: CGPoint(x: index * 6 + 3, y: Int(barHeight)))

}

线状波形图的绘制

线状与条状一样使用同样的方法计算“高度”,但是在绘制条状波形图时,是先画线,再移动,而绘制条状波形图时是先移动再画线。

case .line:

context?.setLineWidth(1.5)        for (index, item) in soundMeters.enumerated() {            let position = maxVolume - (Double(item) - noVoice)    //计算对应线段高度

context?.addLine(to: CGPoint(x: Double(index * 6 + 3), y: position))

context?.move(to: CGPoint(x: Double(index * 6 + 3), y: position))

}

}

进一步完善我们的波形图

在很多时候,录音不单止是需要显示波形图,还需要我们展示目前录音的时间和进度,所以我们可以在波形图上添加录音的进度条,所以我们转向MCProgressView.swift文件进行操作。

使用UIBezierPath配合CAShapeLayer进行绘制。

maskPath是作为整个进度路径的蒙版,因为我们的录音HUD不是规则的方形,所以需要使用蒙版进度路径进行裁剪。

progressPath为进度路径,进度的绘制方法为从左到右依次绘制。

animation是进度路径的绘制动画。

private func configAnimate() {        let maskPath = UIBezierPath(roundedRect: CGRect.init(x: 0, y: 0, width: frame.width, height: frame.height), cornerRadius: HUDCornerRadius)        let maskLayer = CAShapeLayer()

maskLayer.backgroundColor = UIColor.clear.cgColor

maskLayer.path = maskPath.cgPath

maskLayer.frame = bounds       

// 进度路径

/*

路径的中心为HUD的中心,宽度为HUD的高度,从左往右绘制

*/

let progressPath = CGMutablePath()

progressPath.move(to: CGPoint(x: 0, y: frame.height / 2))

progressPath.addLine(to: CGPoint(x: frame.width, y: frame.height / 2))

progressLayer = CAShapeLayer()

progressLayer.frame = bounds

progressLayer.fillColor = UIColor.clear.cgColor //图层背景颜色

progressLayer.strokeColor = UIColor(red: 0.29, green: 0.29, blue: 0.29, alpha: 0.90).cgColor  //图层绘制颜色

progressLayer.lineCap = kCALineCapButt

progressLayer.lineWidth = HUDHeight

progressLayer.path = progressPath

progressLayer.mask = maskLayer

animation = CABasicAnimation(keyPath: "strokeEnd")

animation.duration = 60 //最大录音时长

animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)    //匀速前进

animation.fillMode = kCAFillModeForwards

animation.fromValue = 0.0

animation.toValue = 1.0

animation.autoreverses = false

animation.repeatCount = 1

}

结语

以上就是我在绘制录音波形图的一些心得和看法,在demo中我还为录音HUD加入了高斯模糊和阴影,让HUD在展示上更具质感,这些就略过不提了。虽然如此,但是这个录音HUD我觉得还是有一些缺陷的,一来是和VC的耦合比较高,二是绘制线状波形图的效果并不是太理性,希望各位如果有更好的方法可以与我交流。

SoundVolumeView的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、SoundVolumeView的信息别忘了在本站进行查找喔。