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
相关产品推荐
相关产品推荐

