我正在从命名管道中读取和写入音频.我遇到了一个问题,我的读取过程滞后,导致管道的缓冲区填满和丢弃帧.我想在管道中插入一个任意大尺寸的缓冲区.

我正在尝试使用’dd’来做这件事,但’obs’和’ibs’似乎是指读/写块大小,而不是缓冲区大小?

有没有办法为此目的使用’dd’?

解决方法:


它可以这样使用,但它很糟糕.

例如,dd bs = 1M将是1 MiB缓冲区,但它可能无法解决您的音频问题.如果dd得到一个简短的读取,它将直接传递,所以它不会使用缓冲区.您可以添加iflag = fullblock以强制dd完全填充其缓冲区,但是它将读取1 MiB数据,写入1 MiB数据,读取1 MiB数据,… dd将不会接受输出前的新输入步骤完成,所以你的“缓冲区”将是100%满,100%空,100%满……并且无论多长时间缓冲区填满/清空,另一侧都会被卡住.

在考虑管道缓冲区时,这不是您想要/期望的特性.如果你看一下实际的管道缓冲区,比如bfr或pv,它们都会在输出进行时接受新的输入,它们会努力保持良好的填充率,因此任何一方都不必等待超过绝对必要的时间.

使用实际管道缓冲区时,将始终接受输入(缓冲区未满)并始终提供输出(缓冲区不为空),并且它们可能具有高级选项,例如保证预填充,最小填充,. ..

dd没有做任何事情,事实上dd依赖于在外部进行缓冲,当使用块设备时,读/写并发主要由内核提供(readahead / cache / …).

基本上,您只会将dd视为简约环境中的管道缓冲区,而这些环境中没有其他程序适合可用任务.

如果必须使用dd但dd的特性不适合您的任务,则可以菊花链式连接多个dd以获得缓冲区的“更平滑”结果.但即使这样,它也可能不适合某些用例.

标签: linux, buffer, pipe

相关文章推荐

添加新评论,含*的栏目为必填