我有一个yuv视频(比如stream.yuv)和相应的音频文件(stream.wav)。现在我有GUI,它逐帧渲染原始视频。我目前面临的问题是我需要播放与每个视频帧相关的音频。
我已经尝试了以下操作,但是当我执行此操作时,音频会发出声音
%% Dividing the audio into per-second samples
nframes = 720;
[audioFile, audioSampleFreq] = audioread('stream.wav');
numSamples = length(audioFile);
audioLength = round(numSamples / audioSampleFreq);
for frame = 1:audioLength
start = (frame-1)*audioSampleFreq+1;
stop = frame*audioSampleFreq;
[start stop]
audioFrame1 = audioFile(start:stop,:);
sound(audioFrame1,audioSampleFreq);
end
将音频分成每个视频帧的样本,
audioFileName = 'stream.wav';
nframes = 720;
framerate = 25;
[audioFile, audioSampleFreq] = audioread(audioFileName);
audioFRate = round(audioSampleFreq/framerate);
%% Total number of audio samples
numSamples = length(audioFile);
%% number of audio frames
numFrames = floor(numSamples/audioFRate);
for frame = 1:numFrames
start = (frame-1)*audioFRate+1;
stop = frame*audioFRate;
[start stop]
audioFrame1 = audioFile(start:stop,:);
sound(audioFrame1,audioSampleFreq);
end
有关如何同步YUV帧和每秒音频样本的每帧渲染的任何想法?谢谢!
答案 0 :(得分:0)
我认为你以错误的方式解决问题。将音频信号调整为视频信号通常是错误的方式,因为音频流中的小中断非常明显,而普通观众不会注意丢失的帧。 而是将视频信号与音频信号同步。要快速入门,请设置音频播放器并从以下代码开始:
videorate=25 %fps
audiorate=audio.SampleRate %sample rate
while audio.isplaying()
displayFrame(ceil(audio.CurrentSample/audiorate*videorate))
end
有很多可以改进但我认为这个简单的实现已经显示出比你当前尝试更好的结果。
需要改进的地方
ceil
只是一个快速而肮脏的近似值。相反,您需要在时间displayFrame
拨打f/fps-processing_delay
for f帧,其中processing_delay
是调用displayFrame
和实际显示在屏幕上的图像之间的时间。最初将其设置为1/25
,如果音频和视频似乎未同步,请手动调整它。displayFrame
做出决定的时间。对于较小的时间仍然显示帧,对于较大的间隙丢弃帧并继续下一帧。也许停下来尽早展示。此方法的替代方法是使用可变播放速度的方法,稍微调整音频和视频播放速度以使两者同步。我认为这些方法在Matlab中不会成功,因为您需要以非常低的延迟处理数据才能完成此方法。