代码之家  ›  专栏  ›  技术社区  ›  marvin2k

Linux:录制/播放声音时的计时

  •  1
  • marvin2k  · 技术社区  · 15 年前

    我有一个更一般的问题,关于在标准Linux操作系统中处理声音播放和通过串行端口接收数据的计时。

    现在,我正在读取一个从USB到串行网桥(PL2303)的PCM信号,它是由FPGA记录、编码和发送的。

    现在,我需要在录制的声音流中的已知位置创建“峰值”,并计划在已知时刻录制的同一台机器上播放声音文件。峰必须在最大50ms的窗口内开始和停止,其长度可以是~200ms…

    现在,我的问题是:我能期望时间有多精确?我知道,有几个组件添加了“不可知滞后”,抖动:

    • usb-to-serial网桥从串行端收集大约20个字节,然后将它们发送到usb端(230400baud时,这会导致大约1毫秒)
    • 如果我在录制软件之前直接调用“sleep 1;mpg123$mp3file”,Linux内核会对它们进行不同的调度(这可能会导致一些10毫秒,具体取决于系统负载?)
    • 声卡/驱动程序可能会增加一些未知的延迟…
    • 在我的例子中,像“尼斯”或“sched_setscheduler”这样的技巧会增加价值吗?
    • 我可以在我的录音软件中建立一个额外的线程来播放声音。这样做,时间可能更精确,但我还有很多工作要做…

    谢谢。

    无论如何,我都会尝试,但我正在寻找一些背景知识来更好地理解和解决我即将面临的问题。

    2 回复  |  直到 15 年前
        1
  •  0
  •   t0mm13b    15 年前

    我不是100%确定,但我可以想象您的内核需要重新构建,以允许调度器减少切换任务的延迟时间LA多任务,在内核2.6.x系列中,有一个选项可以通过使内核具有可抢占性使其更平滑。

    • 转到处理器类型和功能
    • 先发制人模式
    • 选择可抢占内核(低延迟桌面)

    这将简化时间安排,并使声音看起来更平滑,减少抖动。

    试着重新编译内核。当然,有很多内核补丁可以减少每个任务切换的时间间隔,使其更加平滑,您的里程可能会因以下情况而有所不同:

    1. 处理器速度-使用什么处理器?
    2. 内存-多少内存?
    3. 磁盘输入/输出-越快,越好

    将这三个因素结合起来,将对调度程序和多任务功能产生影响。延迟越低,则越细。

    顺便说一句,有一个专门的Linux发行版,专门为实时捕获声音而设计,我记不起它的名字了,发行版中的内核经过了大量修补,使得声音捕获非常顺利。

        2
  •  0
  •   marvin2k    15 年前

    又是我……经过一个不安的夜晚,我解决了我奇怪的时间问题…我的第一次编辑是不完全正确的,因为我发布的内容不是100%可复制的。在运行了更多的测试之后,我可以得出以下图表,显示计时精度:

    Results from analysis http://mega2000.de/~mzenzes/pics4web/2010-05-28_13-37-08_timingexperiment.png

    我试了两个不同的 ubuntu-kernels : 2.6.32-21-generic 2.6.32-10-rt

    我试图实现RT调度: sudo chrt --fifo 99 ./experimenter.sh

    我尝试改变省电方式: echo {performance,conservative} | sudo tee /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

    这导致了8个不同的测试,每个测试50次。以下是数字:

                                       mean(peakPos)  std(peakPos) 
    rt-kernel-fifo99-ondemand          0.97           0.0212 
    rt-kernel-fifo99-performance       0.99           0.0040 
    rt-kernel-ondemand                 0.91           0.1423 
    rt-kernel-performance              0.96           0.0078 
    standard-kernel-fifo99-ondemand    0.68           0.0177 
    standard-kernel-fifo99-performance 0.72           0.0142 
    standard-kernel-ondemand           0.69           0.0749 
    standard-kernel-performance        0.69           0.0147
    
    推荐文章