Самый эффективный метод записи файлов для видеомагнитофона Linux

Я работаю над встроенным приложением видеозаписи Linux, которое записывает видео в формате MP4 в файл (на SD-карту в формате FAT).

Некоторые усложняющие факторы заключаются в том, что видео- и аудиоданные поступают от аппаратных кодеков, которые должны обслуживаться с малой задержкой и должны записываться в буферы, поддерживающие DMA.

На данный момент для выходного файла я использую open() и write(), но обнаружил, что write() может занять сотни миллисекунд, чтобы вернуться, когда система находится под нагрузкой, поэтому мои записи выполняются в отдельном потоке.

В нынешнем виде я копирую данные из (небольшого, ограниченного числа) буферов DMA в многомегабайтный кольцевой буфер с функцией malloc, а затем записываю() из него в другом потоке. Это означает, что я делаю как минимум две копии: одну в буфер приложения и одну в кеш системного буфера.

Я рассматриваю возможность использования записи O_DIRECT, чтобы избежать копирования, но меня интересуют любые комментарии. Я заметил, что Роберт Лав комментирует, что O_DIRECT ужасен, но не говорит, почему.

С другой стороны, мне также было бы интересно, если бы кто-нибудь знал способ заставить функцию write() не останавливаться на длительные периоды времени (AIO?), тогда я мог бы использовать буферный кеш, как задумал Линус.

Этот вопрос связан с моим очень старым вопросом о приостановке записи.

8
задан Community 23 May 2017 в 11:59
поделиться