C Linux视频录像机最有效的文件写入方法

C Linux视频录像机最有效的文件写入方法,c,linux,file-io,embedded,C,Linux,File Io,Embedded,我正在开发一个嵌入式Linux录像机应用程序,它将MP4格式的视频写入一个文件(在FAT格式的SD卡上) 一些复杂的因素是,视频和音频数据来自硬件编解码器,必须以低延迟服务,并且必须写入支持DMA的缓冲区 目前,对于输出文件,我使用open()和write(),但发现当系统处于加载状态时,write()可能需要数百毫秒才能返回,因此我的写操作是在单独的线程中完成的 目前,我将数据从(小而有限的)DMA缓冲区复制到一个多兆字节的malloc循环缓冲区,然后从另一个线程中写入()。这意味着我至少要做

我正在开发一个嵌入式Linux录像机应用程序,它将MP4格式的视频写入一个文件(在FAT格式的SD卡上)

一些复杂的因素是,视频和音频数据来自硬件编解码器,必须以低延迟服务,并且必须写入支持DMA的缓冲区

目前,对于输出文件,我使用open()和write(),但发现当系统处于加载状态时,write()可能需要数百毫秒才能返回,因此我的写操作是在单独的线程中完成的

目前,我将数据从(小而有限的)DMA缓冲区复制到一个多兆字节的malloc循环缓冲区,然后从另一个线程中写入()。这意味着我至少要做两次拷贝,一次拷贝到应用缓冲区,一次拷贝到系统缓冲区

我正在考虑尝试直接写作以避免抄袭,但我对任何评论感兴趣。我注意到罗伯特爱,但没有说为什么

另一方面,我也很感兴趣,如果有人知道一种让write()不在长时间内暂停(AIO?)的方法,那么我可以像Linus所希望的那样使用缓冲缓存


这个问题与。

如果这真的是一个嵌入式产品,您可以控制驱动程序源,我会认真研究mmap'ping内存,以允许用户进程访问与设备驱动程序相同的内存,并避免所有这些拷贝


是使用mmap与用户空间进程共享驱动程序内存的示例实现。

SD卡写入性能可能因制造商、操作系统、扇区大小等的不同而有很大差异。也许您已经这样做了,但是您的书写是否在合适的边界上完成(例如,一次64K)?您是否尝试过将SD卡上的文件预分配到大于所需的大小,以便在FAT中保留扇区?@BitBank I进行二进制循环写入,但尚未预分配,正在考虑尝试。你有这方面的经验吗?我在某个地方读到关于由于FAT扇区分配而导致的SD写入延迟的消息。该过程不会对传入的DMA缓冲区进行mmap()。您是否建议在写端使用mmap()作为O_DIRECT的替代方案?如果您有任何关于该使用的经验或文档,您会感兴趣。基本上,驱动程序会使用remap_pfn_range来映射其用户空间的内存。我已经添加了一个链接到我通过谷歌找到的一个样本。