有许多应用程序的例子是基于时间的,可以发送事件或执行复杂的处理,达到非常精细的分辨率和准确度。想想MIDI排序应用程序,音频和视频编辑应用程序。
所以我很好奇,在他们的核心层面,从编程的角度来看,这些应用程序如何做到如此准确呢?
答案 0 :(得分:0)
MIDI和媒体播放本质上完全不同,并以不同方式处理。
对于MIDI,处理的数据非常少。创建具有高优先级的线程来处理MIDI I / O.这就是所需要的。
对于音频,准确性不是问题,但延迟是。声音界面上有一个缓冲区,由软件播放音频定期写入。对于典型的媒体播放器,此缓冲区具有大约300毫秒音频的存储空间。该软件只是将PCM编码的音频波形写入缓冲区。声音界面不断从该缓冲区读取并以恒定速率播放。
对于低延迟音频应用,此缓冲区大小可以非常小,只需5或10毫秒的音频处理。生成音频数据的软件必须再次由具有高优先级的线程处理,并且通常具有许多优化,以便在软件的其余部分(效果和不能)跟不上的情况下使其保持运行。缓冲区不足是常见的。特殊驱动程序通常用于跳过信号链中不需要的软件。 ASIO和DirectX在Windows上很常见。 Windows Vista / 7和OSX都将其音频API称为“核心音频”,并提供低延迟功能而无需特殊驱动程序。
视频是一个完全不同的野兽。在可能的情况下,解码视频由硬件处理。这就是手机等慢速设备能够播放720p视频的方式。如果硬件可以处理编解码器,则软件只需要向其发送数据。在编解码器不受支持的情况下,视频必须用软件解码,速度要慢得多。即使在现代PC上,软件解码也会导致视频不连贯或滞后。
音频与视频的同步也是一个问题。我不太了解它,但我的理解是音频是主时钟,视频与它同步。您不能简单地开始播放并期望计时,因为不同的声音接口将对44.1kHz(或任何其他采样率)有不同的想法。您可以通过同时在两个不同的设备上播放相同的音频来证明这一点,并且随着时间的推移听它们分开。