如何将方法调用与 alsa 播放同步?
How can I synchronize a method call with alsa playback?
我正在尝试编写一个程序,将灯光与基本 wav 文件的播放同步。我努力浏览了所有 alsa 文档,ffplay.c 的来源并在互联网上四处搜索,但很难弄清楚如何完成看似常见且简单的任务。
基本上我想做两件事,第一是在播放音频时读取按键事件并将偏移量存储在文件中。第二个是获取这些队列文件并稍后加载它们,这次是在不同的音频设备上,例如 raspberry pi.
我正在苦苦思索如何首先考虑偏移位置初始捕获中的延迟,以及当我在完全不同的硬件设备上播放时如何处理该延迟。
我知道 ffmpeg 套件使用 snd_pcm_delay()
来处理其中的一些问题,但我什至连基本技术都在苦苦挣扎。不是什么复杂的回放机制,只是循环中的阻塞写入。
我会 post 一些代码,但我现在没有它,它只是当前无效的乱码。
所以最后证明这有点容易,但是要弄清楚并不容易。使用 snd_pcm_delay
是正确的路径。
当前正在播放的实际音频样本是写入的帧数 - snd_pcm_delay
,这为您提供了一个相对准确的当前播放帧(您现在应该听到的帧)。这应该用于计算时间戳的位置,并且作为应用程序等待当前位置领先或与下一个提示事件相同的位置索引。
这是 GStreamer 所做的事情,它以一种更加有据可查、更具可扩展性的方式构建了一种更复杂的同步算法,允许音频在单独的线程上 运行,同时避免每次定位时钟时都锁定需要。如果可能的话,我会使用 GStreamer 来实现任何类似的应用程序。
但是如果您不需要 GStreamer 的所有复杂性并且想要减少依赖项,基本方法就是我上面描述的方法。
我正在尝试编写一个程序,将灯光与基本 wav 文件的播放同步。我努力浏览了所有 alsa 文档,ffplay.c 的来源并在互联网上四处搜索,但很难弄清楚如何完成看似常见且简单的任务。
基本上我想做两件事,第一是在播放音频时读取按键事件并将偏移量存储在文件中。第二个是获取这些队列文件并稍后加载它们,这次是在不同的音频设备上,例如 raspberry pi.
我正在苦苦思索如何首先考虑偏移位置初始捕获中的延迟,以及当我在完全不同的硬件设备上播放时如何处理该延迟。
我知道 ffmpeg 套件使用 snd_pcm_delay()
来处理其中的一些问题,但我什至连基本技术都在苦苦挣扎。不是什么复杂的回放机制,只是循环中的阻塞写入。
我会 post 一些代码,但我现在没有它,它只是当前无效的乱码。
所以最后证明这有点容易,但是要弄清楚并不容易。使用 snd_pcm_delay
是正确的路径。
当前正在播放的实际音频样本是写入的帧数 - snd_pcm_delay
,这为您提供了一个相对准确的当前播放帧(您现在应该听到的帧)。这应该用于计算时间戳的位置,并且作为应用程序等待当前位置领先或与下一个提示事件相同的位置索引。
这是 GStreamer 所做的事情,它以一种更加有据可查、更具可扩展性的方式构建了一种更复杂的同步算法,允许音频在单独的线程上 运行,同时避免每次定位时钟时都锁定需要。如果可能的话,我会使用 GStreamer 来实现任何类似的应用程序。
但是如果您不需要 GStreamer 的所有复杂性并且想要减少依赖项,基本方法就是我上面描述的方法。