如何将方法调用与alsa播放同步?

时间:2015-11-09 13:09:37

标签: linux audio ffmpeg alsa

我试图编写一个程序,将灯光同步到基本wav文件的播放。我已经在所有alsa文档中挣扎,这是ffplay.c的源代码,并在互联网上搜索过,但很难弄清楚如何做一个看似普通而简单的任务。

基本上我想做两件事,第一件事是在播放音频时读取按键事件并将偏移量存储在文件中。第二个是获取这些队列文件并在以后加载它们,这次是在不同的音频设备上,如树莓派。

我在如何首先考虑偏移位置的初始捕获中的延迟以及如何在完全不同的硬件设备上回放时如何处理延迟时苦苦挣扎。

我知道ffmpeg套件会使用snd_pcm_delay()来解决其中的一些问题,但我甚至在基本技术方面都在苦苦挣扎。它不是一个复杂的播放机制,只是循环中的阻塞写入。

我发布了一些代码,但此刻我还没有提供这些代码,而且目前的黑客攻击只是乱七八糟。

1 个答案:

答案 0 :(得分:1)

所以事实证明这最终有点容易,但要弄清楚并不容易。使用snd_pcm_delay是正确的路径。

正在播放的当前实际音频样本是写入的帧数 - snd_pcm_delay,这为您提供了一个相对精确的当前播放帧(您现在应该听到的帧)。这应该用于计算时间戳的位置,并作为应用程序等待当前位置提前或与下一个提示事件相同的位置索引。

这是GStreamer以更加文档化和更具扩展性的方式所做的事情,构建更复杂的同步算法,允许音频在单独的线程上运行,同时避免每次需要位置时钟时锁定。如果可能的话,我会使用GStreamer来实现任何类似的应用程序。

但是如果你不需要GStreamer的所有复杂性并希望削减你的依赖关系,那么基本方法就是我上面描述的方法。