根据Matlab中的视频帧速率划分.wav文件

时间:2015-11-28 00:17:32

标签: matlab video wav video-processing yuv

我有一个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帧和每秒音频样本的每帧渲染的任何想法?谢谢!

1 个答案:

答案 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做出决定的时间。对于较小的时间仍然显示帧,对于较大的间隙丢弃帧并继续下一帧。也许停下来尽早展示。
  • 当您的视频信号真的搞砸了,例如在最后25帧中丢掉15,检查可能的原因。处理高分辨率原始视频,这通常是因为您的硬盘速度较慢,因此短时间暂停视频和音频应该允许缓冲区再次填满。

此方法的替代方法是使用可变播放速度的方法,稍微调整音频和视频播放速度以使两者同步。我认为这些方法在Matlab中不会成功,因为您需要以非常低的延迟处理数据才能完成此方法。