Титла: Изпълнение на аудио в програма на С Публикувано от: LinC в Jul 25, 2013, 23:22 Здравейте,
Пиша на С под линукс и в един момент се яви необходимост да изпълня аудио файл на едно място в програмата. Много търсих и четох, но така и не направих нещата. Под Windows видях как се прави, но под линукс не става точно така. Създавам ресурсен файл, в който описвам пътя до аудиофайла, но е нужно да го свържа с аудиоустройството, а това не знам как да направя. Аудиокартата ми е интегрирана: Intel Corporation N10/ICH 7 Family High Definition Audio Controller (rev 01). Предполагам, че трябва да я търся в /dev/snd/. Тук, обаче, има няколко файла и не знам кой е. Ползвам УСУ 8.3. Някой може ли да ми даде напътствия по проблема? Благадаря предварително! Титла: Re: Изпълнение на аудио в програма на С Публикувано от: laskov в Jul 26, 2013, 00:00 Няма ли да е по-лесно да стартираш външна програма с параметър името на файла? Ако да, виж какво казва гугъл за "linux command line audio player" например.
Титла: Re: Изпълнение на аудио в програма на С Публикувано от: gat3way в Jul 26, 2013, 00:27 Можеш да пишеш директно върху устройството, но това е само ако имаш някакви raw данни, дори тогава ще се налага да викаш разни ioctl-та за да си настроиш разни PCM параметри, там sampling rate, канали и тем подобни глупости. Съответно ioctl-тата можеш да ги разбереш единствено из kernel-ските хедъри и сигурно се променят чат-пат, което прави начинанието грозно и зависимо от версията на ядрото. Оттам нататък можеш да ползваш някакви библиотеки, които ти осигуряват някаква абстракция над тези неща, като почнеш от на alsa библиотеките и стигнеш до нещо на по-високо ниво, примерно там gstreamer. За съжаление не мога да помогна много, защото никога не ми се е налагало да се занимавам с това кой знае колко, но силно ти препоръчвам да ползваш някаква high-level библиотека и да не се занимаваш с глупости. Най-малкото защото надали ти се иска да се занимаваш с различни файлови формати, извратени компресии и т.н.
Титла: Re: Изпълнение на аудио в програма на С Публикувано от: victim70 в Jul 26, 2013, 23:27 Като за начало използваш ffmpeg библиотеката за декодиране до удобен RAW вид http://ffmpeg.org/doxygen/trunk/api-example_8c-source.html ($2) . После през ALSA. Не е сложно но е дълго за обяснение. За функциите на ffmpeg се обърни към документацията (ужасна е). За Стрима към АЛСА можеш да стартираш от тука http://home.roadrunner.com/~jgglatt/tech/linuxapi.htm ($2) http://equalarea.com/paul/alsa-audio.html ($2) - по сносно е обяснено от документацията и. Има и пример с който аз съм тръгнал и пробвал.
Само ffmpeg не съм пробвал но с повече пот ще тръгне. Апликацията трябва да е като стрим организирана т.е. Инициализираш ALSA отваряш 2 треда в единят отваряш файла и го подаваш към декодера, изходните данни ги записваш в ALSA устройството, което е 2 рият тред. Декодирането трябва да е с 2-3 блока напред преди да задействаш трансвера на опашката към ALSA. Както и ако опашката се запълни треда на декодера трябва да изчака освобождаването на сегмент. Шернатият ресурс между тредовете, е опашката на декодираният файл. Заключващ е мутекс към декодера. Друг вариянт е с 2 треда и IPC комуникация между тях. Единят е декодиращ другият е възпроизвеждащ. Така е по лесно на пръв поглед но е много бъгаво и дърводелско. Може на по-слаби компютри да насича или да оставя отворена IPC връзка. Съжалявам че е толкова объркано обяснението. Реализацията обаче изглежда по-просто. Титла: Re: Изпълнение на аудио в програма на С Публикувано от: gat3way в Jul 27, 2013, 00:00 С gstreamer е значително по-лесно, 20-тина реда код и си готов: http://felipec.wordpress.com/2008/01/19/gstreamer-hello-world/ :)
Ама пък заниманието с декодиране с ffmpeg и засилване към ALSA е значително по-обогатяващо, ако ми беше по-интересно и имах време, бих си поиграл. Нещата най-добре се научават като си строшиш главата докато разбереш как работят и си ги направиш сам. Титла: Re: Изпълнение на аудио в програма на С Публикувано от: n00b в Jul 27, 2013, 03:13 http://www.mpg123.de/ палиш едно приложение на заден фон и му шибваш подходящите параметри
ИЛИ ползваш libao - едно от най-читавите решения на около 5 реда: ao_initialize() ao_open_file() ao_play() ao_close() ao_shutdown() понеже съм на 4 бири и не ми се пише оставям сам да разбереш параметрите с които да ги извикаш. ИЛИ ползваш: PortAudio SDL Такива каубойски изпълнения като отваряш /dev/snd и пишеш не ти ги препоръчвам! Титла: Re: Изпълнение на аудио в програма на С Публикувано от: LinC в Jul 29, 2013, 19:09 Момчета, благодаря за помощта!
Налага ми се да уча и правя много неща наведнъж и между другото реших да запусна и едно аудио, но тук не познах, че ще е лесно. Отделих един ден да чета, но накрая преминах към други задачи, защото явно имам още да натрупвам. Сега, обаче, с вашите насоки мисля да се върна при първа възможност и да доведа нещата докрай с аудиото. |