You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matlab生成视频丢失原音频 如何逐帧添加对应音频到输出视频

问题根因

你当前的代码仅通过getframe抓取GUI画布的画面帧写入输出文件,Matlab的VideoWriter不会自动关联输入视频的音频流,且你全程没有处理音频链路,因此输出文件完全缺失音轨。
另外你现有代码存在一处笔误:v3读帧时传入的索引是i1,应改为i3,否则v3画面会和v1绑定出现不同步。


可直接集成的修复方案

以下方案默认保留v1的原始音轨,如果你需要保留其他输入视频的音轨,替换对应变量即可。

1. 初始化阶段配置(进入while帧循环前添加)

首先确保你初始化VideoWriter时选择支持音轨的封装格式,不要用默认的Motion JPEG AVI:

% 初始化输出视频对象,用MPEG-4格式支持音轨嵌入
writerObj = VideoWriter('output_combine.mp4','MPEG-4');
writerObj.FrameRate = v1.FrameRate; % 帧率和原视频对齐
open(writerObj);

% 提取主视频(此处为v1)的音频数据和采样率
[inputAudio, audioFs] = audioread(v1.Name);
% 计算单帧对应的音频采样点数量
samplesPerFrame = round(audioFs / writerObj.FrameRate);
% 初始化输出音频存储数组
outputAudio = [];

2. 帧循环内同步采样音频

在你现有循环中,writeVideo(writerObj,frame); 这行代码之前,插入以下片段,实现帧和音频采样的一一对应:

% 定位当前帧对应的音频采样区间
sampleStart = (i1 - 1) * samplesPerFrame + 1;
sampleEnd = min(i1 * samplesPerFrame, size(inputAudio,1));
% 追加当前帧对应的音频片段
outputAudio = [outputAudio; inputAudio(sampleStart:sampleEnd, :)];

如果要保留v2/v3/v4的音轨,只需要把上面代码里的inputAudio换成对应视频提取的音频数组,帧索引用i2/i3/i4替换即可。如果需要四个视频音轨混音,分别提取四个视频的音频、对齐时长后按比例相加得到混音数组,再替换inputAudio即可。

3. 帧写入完成后写入音轨

在while帧循环结束后,先写入完整音轨再关闭输出对象:

% 所有画面帧写入完成后,写入对齐的音轨
writeVideo(writerObj, outputAudio, audioFs);
% 关闭写入对象生成最终文件
close(writerObj);

注意事项
  • 如果你的四个输入视频时长不一致,循环会在最短的视频读完后终止,音频截取也会同步在对应位置停止,不会出现音画不同步。
  • 如果需要更高的音频同步精度,可以根据实际帧的时间戳(v1.CurrentTime)计算音频采样位置,替换固定的每帧采样数逻辑即可。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 18:57:23