Как усилить, увеличить битрейт и заглушить записанный звук в Windows Phone 7?

Я столкнулся со следующей проблемой, связанной с записью голоса (аудио) в Windows Phone 7.

Я записываю звук, используя класс Microphone, доступный в пространстве имен Microsoft.Xna.Framework.Audio. вот код -

Объявление переменной:

private Microphone mic = Microphone.Default;
private MemoryStream stream;
private const string FILE_NAME = "recording.mp3";
byte[] buffer;

Код нажатия кнопки записи-

mic.BufferDuration = TimeSpan.FromSeconds(1);
buffer = new byte[mic.GetSampleSizeInBytes(mic.BufferDuration)];

// Create the event handler.  I could have done an anonymous   
// delegate here if I had so desired.  
mic.BufferReady += new EventHandler<EventArgs>(mic_BufferReady);

stream = new MemoryStream();
mic.Start();

Код события готовности буфера ----------

void mic_BufferReady(object sender, EventArgs e)
{
    mic.GetData(buffer);
    // Write buffer to stream
    stream.Write(buffer, 0, buffer.Length);  
}

Код остановки кнопки -

private void btnStop_Click(object sender, RoutedEventArgs e)
{
    dt.Stop();
    btnStop.IsEnabled = false;
    btnPlayRecording.IsEnabled = true;

    mic.Stop();
    //Writing stream into Storage
     writeFile(stream);
}

private void writeFile(MemoryStream s, string name)
{
    try
    {
        using (var userStore = IsolatedStorageFile.GetUserStoreForApplication())
        {
            if (userStore.FileExists(name))
            {
                userStore.DeleteFile(name);
            }
            using (var file = userStore.OpenFile(name, FileMode.CreateNew))
            {
                s.WriteTo(file);
            }
        }
    }
    catch (Exception ee)
    {

    }
}

Как только я сохраняю поток в изолированное хранилище и воспроизводю его, громкость очень низкая, и качество тоже не очень хорошее.

So

  1. Можем ли мы усилить Громкость?
  2. можно ли увеличить битрейт?
  3. Можем ли мы сделать Fadin-Fadout?

Если все эти три невозможны в Windows Phone 7, то есть ли какой-либо сторонний API для выполнения всех этих операций?

заранее спасибо


person Mukesh Sharma    schedule 26.10.2012    source источник


Ответы (1)


Усиление в .NET не является тривиальным. Лучший подход, который я нашел, состоял в том, чтобы сделать внешний вызов процесса к «SoX, швейцарскому армейскому ножу программ обработки звука». (http://sox.sourceforge.net/)

У меня нет телефона с Windows 7, поэтому я не уверен, работает ли там SOX.

Формат будет SOX -V Volume_parameter inputFileName outputFileName для усиления, поэтому:

"sox.exe -v 3.0 myNormalFile.wav myAmpedFile.wav"

даст вам усиление 300%. Sox также позволяет изменять битрейт... не уверен в Fadein/Fadeout.

У меня нет ничего специально для телефона с Windows 7, но в прямом коде .NET/С#:

string finalFileName = "myAmplifiedFile.WAV";
string tmpFileName = "tmpHoldingFile.WAV";
string soxEXE = @"C:\SOX\sox.exe";
string soxArgs = "-v 3.0 ";

/// OTHER STUFF HERE 

/*-----------------------------------------------------------
* Call the SOX utility to amplify it so it is 3 times as loud.
*-----------------------------------------------------------*/
try
{
    System.Diagnostics.Process process = new System.Diagnostics.Process();
    process.StartInfo = new System.Diagnostics.ProcessStartInfo();
    process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
    process.StartInfo.FileName = soxEXE;
    process.StartInfo.Arguments = string.Format("{0} {1} {2}",
                             soxArgs, tmpFileName, finalFileName);
    process.Start();
    process.WaitForExit();
    int exitCode = process.ExitCode;
}
catch (Exception ex)
{
    string err = ex.Message;
    return false;
}
/*-------------------------------------------------------------
 * OK, now we play it using SoundPlayer
 *-------------------------------------------------------------*/
try
{
    SoundPlayer simpleSound = new SoundPlayer(@finalFileName);
    simpleSound.PlaySync();
    FileInfo readFile = new FileInfo(finalFileName);
    string finalDestination = finalDirectory + "/" + readFile.Name;
    readFile.MoveTo(finalDestination);
}
catch (Exception e)
{
    string errmsg = e.Message;
    return false;
}
finalFileName = "";
tmpFileName = "";
spVoice = null;
person MarkJoel60    schedule 06.05.2013