Web中video或者audio音量突破最大值的解决方案及思路

背景:最近手上的项目因为需要播放实时视频,但是从设备上拿取的视频资源音量那是相当的小,电脑音量拉满依然听着很小,所以就有了一个需求,让视频声音放大,类似于优酷这些网站200%的声音。

一开始也在找可以将音量的限制从0~1放大到0~2的方法,但是找了圈也没找到,后面想了下,如果没法将限制放开,是否可以让1%发挥出2%的音量呢呢,基于这个想法,找了一圈找到下面的方法(注释均为个人基于webAudioContext文档理解而来)。
// 加载flv视频
const loadFlvVideo = () => {
    nextTick(() => {
        if (!flvjs.isSupported()) {
            return false;
        }
        if (props.videoInfo.length > 0 && monitorVideo.value !== void 0) {
            let end =
                curLayout.value.num < props.videoInfo.length
                    ? curLayout.value.num
                    : props.videoInfo.length;
            let videos = props.videoInfo.slice(0, end);
            flvPlayers.value = videos.map((item, idx) => {
                //对每个视频容器设置音量放大
                amplifyMedia(monitorVideo.value[idx], 2)
                return createFlvjs(
                    item.url || "",
                    monitorVideo.value[idx] as HTMLMediaElement
                );
            });
        }
    });
};
// 设置音量超限
const amplifyMedia = (mediaElem:HTMLMediaElement, multiplier:number) => {
    // 创建音频处理对象AudioContext与webkitAudioContext无区别,只是在不同浏览器的命名
    let context = new (window.AudioContext || window.webkitAudioContext)();
    // 创建音频接口输入到mediaElem,则可以通过elSource可以修改其音频
    let elSource = context.createMediaElementSource(mediaElem) 
    // 创建GainNode(音量处理模块)
    let gainNode = context.createGain() 
    // 将音量处理模块与mediaElem绑定
    elSource.connect(gainNode); 
    // AudioDestinationNode接口表示音频图形的最终输出地址,此处为绑定到对应的扬声器
    gainNode.connect(context.destination);
    //GainNode的gain实例属性表示增益效果,可以理解为音量放大比例
    gainNode.gain.value = multiplier 
}

原方法:https://cwestblog.com/2017/08/17/html5-getting-more-volume-from-the-web-audio-api/

webAudioContext:https://developer.mozilla.org/zh-CN/docs/Web/API/AudioContext

### Unity 中使用 VideoPlayer 组件控制音量 在 Unity 中,`VideoPlayer` 组件本身并不直接提供音量控制功能。为了实现这一目标,通常会结合 `AudioSource` 组件来管理音频输出并调整其属性。 当创建或获取 `VideoPlayer` 实例时,关联一个 `AudioSource` 是必要的步骤之一[^3]: ```csharp private AudioSource source; void Start() { var vPlayer = GetComponent<VideoPlayer>(); if (vPlayer != null && !vPlayer.targetCameraForPlayback) { source = gameObject.AddComponent<AudioSource>(); vPlayer.audioOutputMode = VideoAudioOutputMode.AudioSource; vPlayer.SetTargetAudioSource(0, source); } } ``` 通过上述代码片段,在初始化阶段设置了 `VideoPlayer` 的音频输出模式为 `AudioSource` 并指定了具体的目标 `AudioSource` 对象。这使得可以通过修改该 `AudioSource` 来影响最终听到的声音效果。 对于实际应用中的音量调节需求,则主要依赖于设置 `AudioSource.volume` 属性值来进行线性缩放处理。取值范围通常是 0 到 1 之间的小数表示静默至最大响度之间的任意程度[^2]: ```csharp // 设置音量大小,参数 volumeValue 应介于 0 和 1 之间 public void SetVolume(float volumeValue) { if (source != null) { source.volume = Mathf.Clamp(volumeValue, 0f, 1f); // 确保数值合法 } } // 示例:将当前播放器的音量设为一半 SetVolume(0.5f); ``` 此外还可以考虑构建简单的 UI 接口让用户能够直观地改变媒体文件回放期间的整体声效强度。比如利用 Slider 控件绑定到此类函数调用上以便实时响应用户的交互行为。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值