【问题标题】:Divide a .wav file according to the video frame rate in MatlabMatlab中根据视频帧率分割一个.wav文件
【发布时间】:2015-11-28 00:17:31
【问题描述】:

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

【问题讨论】:

    标签: matlab video wav video-processing yuv


    【解决方案1】:

    我认为您以错误的方式解决了这个问题。使音频信号适应视频信号通常是错误的,因为音频流中的小中断非常明显,而普通观众不会注意到丢失的帧。 相反,将您的视频信号与音频信号同步。要快速开始,请设置一个音频播放器并从以下代码开始:

    videorate=25 %fps
    audiorate=audio.SampleRate %sample rate
    while audio.isplaying()
       displayFrame(ceil(audio.CurrentSample/audiorate*videorate))
    end
    

    有很多可以改进的地方,但我认为这个简单的实现已经显示出比您当前的尝试更好的结果。

    需要改进的地方

    • 不要两次渲染同一帧。
    • ceil 只是一个快速而肮脏的近似值。相反,您需要在f/fps-processing_delay 时为帧 f 调用displayFrame,其中processing_delay 是调用displayFrame 和实际出现在屏幕上的图像之间的时间。最初将其设置为 1/25,如果音频和视频似乎不同步,请手动调整它。
    • 如果错过了应该致电displayFrame 的时间,请做出决定。对于小的时间仍然显示帧,对于较大的间隙,丢弃帧并继续下一个。也许暂停以显示不早。
    • 当您的视频信号确实混乱时,例如在最后 25 帧中丢掉 15 帧,检查可能的原因。处理高分辨率原始视频,这通常是因为您的 HDD 速度较慢,因此短时间暂停视频和音频应该会让缓冲区再次填满。

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

    【讨论】:

    • 感谢您的回复。你说同一帧不应该被渲染两次。我认为这与您传递给 displayFrame 函数的参数冲突。例如,一个测试 .wav 文件的采样率为44100,总共有1323000 个样本。现在对于这个视频,如果我按照您上面提到的 while 循环,它将等效于 for i = 1: numSamples displayFrame(ceil((i/sampleRate)*fps)) end 这将多次渲染同一帧。我错过了什么吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    相关资源
    最近更新 更多