Как воспроизвести файл не-PCM или конвертировать его в PCM на лету?

Следующий код работает с некоторыми wav-файлами, но с другими, которые я получаю, "InvalidOperationException не обрабатывается. Message=Sound API поддерживает только воспроизведение файлов волн PCM".

var webClient = new WebClient();
webClient.DownloadFile(url, fileName);
var fileSound = new SoundPlayer(fileName);
fileSound.PlaySync();

Есть ли способ программно проверить, является ли файл wav "плохим" (не файл волны PCM), а затем преобразовать его при необходимости?

Странно то, что код работает в унаследованном приложении Delphi - все файлы wav воспроизводятся просто отлично. Вот код Delphi:

filename := GetEnvironmentVariable('TEMP')+'\archieAndDingbat.wav';
URLDownloadToFile(nil, PChar(url), PChar(filename), 0, nil);
PlaySound(filename);

Я посмотрел на свойства двух файлов в Проводнике и увидел, что разница действительно есть. Для воспроизводимого файла его аудиоформат - PCM; тот, кто не будет играть, это CCITT u-Law.

Итак... Мне нужен способ конвертации из CCITT u-Law в PCM на лету после загрузки этих файлов (они загружаются с URL-адреса, а затем воспроизводятся локально) ИЛИ, возможно, другой способ воспроизведения этих файлов, чем PlaySync() ...

3 ответа

Решение

Чтобы сделать это, используйте код newkie по адресу: http://www.codeproject.com/Articles/175030/PlaySound-A-Better-Way-to-Play-Wav-Files-in-C?msg=4366037

В моем случае, по крайней мере, мне пришлось поменять все буквы X в нижнем регистре на буквы X в верхнем регистре, чтобы заставить его работать.

Посмотрите на аудиолаб библиотеку из митов. Отлично работает

Итак, вы хотите воспроизвести файл или конвертировать его? Какова основная цель? Вы играете это как доказательство того, что вы можете конвертировать, или вы конвертируете это, потому что вы не знаете, как играть в неконвертированный файл? http://www.catb.org/esr/faqs/smart-questions.html

В заголовке вашего вопроса указано "конвертировать", а в теле - "Играть"

Этот ответ о проигрывании файлов.


Вы также можете попробовать использовать кодеки FFDShow напрямую, без промежуточного DirectX. http://en.wikipedia.org/wiki/Libavcodec и http://libav.org/ и http://ffmpeg.org/ (у них недавно был раскол)

Поиск в Google для "FFDShow dotnet", "libav dotnet", "ffmpeg dotnet" показывает множество библиотек для его использования, таких как


Также есть библиотека BASS. Он предназначен для воспроизведения звука во время игр, поэтому он, вероятно, имеет меньший диапазон форматов и не слишком много для перекодирования. Тем не менее, многие музыкальные плееры построены на его основе. Некоторые говорят, что это самый простой в использовании API. Так что стоит задуматься. http://www.un4seen.com/


http://mediainfo.sf.net/ - это библиотека (нативная DLL-библиотека win32 / win64), позволяющая проверять содержимое большинства мультимедийных форматов. Я не знаю, легко ли использовать tis C или C++ APis со стороны C#.

Другие вопросы по тегам