You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Unity编辑器及Windows独立应用播放视频音频卡顿问题排查

解决Unity中视频音频卡顿(音频时长>视频时长)的问题

我之前也碰到过一模一样的情况——Unity编辑器或者打包后的Windows独立应用里播放视频时音频卡得不行,但用系统自带播放器或者VLC播就完全正常,最后排查出来也是音频时长比视频长导致的。下面给你几个靠谱的解决思路:

最彻底的方案:重新编码统一音视频时长

这是从根源解决问题的办法,用视频处理工具把音轨时长和视频对齐就行。推荐用FFmpeg(免费开源,命令行操作快)或者HandBrake(可视化界面,新手友好):

  • 用FFmpeg的话,直接用这条命令裁剪音频到视频时长:
    ffmpeg -i 你的视频文件.mp4 -c:v copy -c:a aac -t 视频实际时长 输出文件.mp4
    
    比如视频时长是1分20秒,就把视频实际时长换成00:01:20就行,这个命令会保留原视频画质,只调整音频时长。
  • 如果用可视化工具,比如Premiere或者剪映,把音频轨道剪到和视频轨道一样长再导出就行。

不想重新编码?试试Unity脚本同步音视频

如果暂时没法重新编码视频,可以把音频单独提取出来,用脚本手动同步播放:

  1. 先把视频里的音频提取成单独的.mp3.wav文件(用FFmpeg或者格式工厂都能搞定);
  2. 在Unity场景里给视频所在物体加VideoPlayerAudioSource组件,把提取好的音频拖给AudioSource;
  3. 写个简单的同步脚本:
    using UnityEngine;
    using UnityEngine.Video;
    
    public class SyncVideoAudio : MonoBehaviour
    {
        [SerializeField] private VideoPlayer _videoPlayer;
        [SerializeField] private AudioSource _audioSource;
    
        private void Start()
        {
            _videoPlayer.prepareCompleted += StartAudioSync;
            _videoPlayer.Play();
        }
    
        private void StartAudioSync(VideoPlayer player)
        {
            _audioSource.Play();
        }
    
        private void Update()
        {
            // 视频停了就立刻停音频
            if (!_videoPlayer.isPlaying && _audioSource.isPlaying)
            {
                _audioSource.Stop();
            }
        }
    }
    
    把脚本挂在同一个物体上,关联好VideoPlayer和AudioSource,这样播放时就能手动同步,避免音频因为时长过长继续播放导致卡顿。

临时应急:调整Unity VideoPlayer设置

如果赶时间,先试试调整VideoPlayer的设置看能不能缓解:

  • Audio Output ModeDirect改成Audio Source,有时候这种切换能让Unity更好地处理音轨不匹配的情况;
  • 临时勾选Loop选项,虽然不能解决根本问题,但可能会让卡顿现象不那么明显,适合临时测试用。

额外提醒

以后录制视频的时候尽量用支持音视频同步录制的工具,避免出现音轨时长超过视频的情况,从源头减少这类问题~

内容的提问来源于stack exchange,提问作者MBS

火山引擎 最新活动