Аудио формат файла, который можно записать без поиска - PullRequest
3 голосов
/ 03 декабря 2011

Я хочу записать аудиоданные на стандартный вывод, предпочтительно используя libsndfile.Когда я выводил WAV в / dev / stdout, мне удалось написать заголовок, но затем я получил ошибку

Error : could not open file : /dev/stdout
System error : Illegal seek.

Я предполагаю, что это связано с http://www.mega -nerd.com / libsndfile /FAQ.html # Q017 , некоторые форматы файлов не могут быть записаны без поиска.Однако, когда я пытаюсь вывести SF_FORMAT_AU |Вместо этого SF_FORMAT_PCM_16, я все еще получаю ту же ошибку незаконного поиска.

Существуют ли какие-либо форматы аудиофайлов, которые можно записать полностью без поиска?

Я использую Linux.

РЕДАКТИРОВАТЬ: Это может быть очевидно, но формат RAW работает (без поиска).К сожалению, мне нужен формат с метаинформацией, такой как частота дискретизации.

Ответы [ 3 ]

3 голосов
/ 04 декабря 2011

Вы должны закончить читать этот FAQ ... ссылка, которую вы нам даете, содержит ответы на все вопросы.

Однако существует как минимум один формат файла (AU), который специально предназначен для записи в канал.

Так что используйте AU вместо WAV.

Также убедитесь, что вы открываете объект SNDFILE с помощью sf_open_fd, а не sf_open_virtual (или sf_open):

SNDFILE* sf_open_fd      (int fd, int mode, SF_INFO *sfinfo, int close_desc) ;
SNDFILE* sf_open_virtual (SF_VIRTUAL_IO *sfvirtual, int mode, SF_INFO *sfinfo,
                          void *user_data) ;

Если вы используете sf_open_fd, то libsndfile будет использовать fstat, чтобы определить, является ли дескриптор файла конвейером или обычным файлом. Если вы используете sf_open_virtual или sf_open, это будет означать, что файл доступен для поиска. Это похоже на ошибку в libsndfile, но вы все равно должны использовать sf_open_fd.

Сноска: Не открывать /dev/stdout, чтобы получить стандартный вывод; он уже открыт, и нет необходимости открывать его снова. Используйте дескриптор файла STDOUT_FILENO.

0 голосов
/ 04 декабря 2011

Вы можете записать во временный файл (возможно, в / tmp), позволить libsnd попытаться изменить заголовок .wav (RIFF) временного файла, а затем, после того как libsnd закроет файл, вывести поток временного файлав стандартный вывод.

0 голосов
/ 04 декабря 2011

Закончено выводить «бесконечный» wav-заголовок, а затем записывать необработанные данные PCM в течение всего времени звучания.Не совсем верно, но большинство игроков, кажется, все равно понимают.

Заголовок wav здесь, на случай, если кто-то захочет: https://gist.github.com/1428176

...