Формат аудиофайла, который может быть записан без поиска

StackOverflow https://stackoverflow.com/questions/8370499

Вопрос

Я хочу записать аудиоданные в стандартный вывод, предпочтительно используя 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 работает (без поиска).К сожалению, мне нужен формат, содержащий метаинформацию, такую как частота дискретизации.

Это было полезно?

Решение

Вам следует дочитать этот 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.

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top