NAudio 1.7 MediaFoundationEncoder

У меня проблема с MediaFoundationEncoder

Мне нужно записать из файла устройства ввода в формате AAC, я пишу следующий код:

    private Timer timer;
    private static IWaveIn _waveIn;
    private static IWaveProvider _provider;
    public void StartRecorder()
    {
        _waveIn = new WaveInEvent
            {
                WaveFormat = new WaveFormat(8000, 1)

            };
        _provider = new WaveInProvider(_waveIn);

        _waveIn.DataAvailable += OnDataAvailable;
        _waveIn.StartRecording();

        //for testing purpose write only first 5 seconds.
        timer = new Timer(5000);
        timer.Elapsed += (sender, args) => Stop();
        timer.Start();


    }

    private void Stop()
    {
        timer.Stop();
        _waveIn.StopRecording();
        _waveIn.Dispose();
        _waveIn = null;
        var outputFilename = String.Format("D:\\{0:yyy-mm-dd HH-mm-ss}.aac", DateTime.Now);
        MediaFoundationEncoder.EncodeToAac(_provider, outputFilename);
        _provider = null;
    }

Также пробовал использовать MediaFoundationEncoder.EncodeToWma - НО размер файла продолжал расти даже после остановки записи и удаления _waveIn. Временная шкала в файле правильная, что-то записывает в файл мусорные байты.

P.S. Я использую последнюю сборку NAudio (1.7).


person Roman Badiornyi    schedule 01.06.2013    source источник
comment
Несколько вещей, которые можно попробовать: 1. Запустите демонстрационное приложение WPF, чтобы перечислить кодировщики и декодеры MF и убедиться, что у вас действительно есть кодировщик AAC. 2. попробуйте использовать файл с расширением .mp4.   -  person Mark Heath    schedule 01.06.2013
comment
Спасибо, Марк, за помощь, вы правы, проблема была с кодировщиками MF, я успешно запускаю приведенный выше код в Windows 8. Но проблема с увеличением размера файла осталась. Можете ли вы помочь также с этим вопросом?   -  person Roman Badiornyi    schedule 02.06.2013


Ответы (1)


Проблема бесконечного увеличения размера файла, вероятно, связана с тем, что ваш поставщик ввода никогда не возвращает 0 из своего метода чтения. Я бы порекомендовал вам записать все аудио в поток памяти, а затем использовать его с RawSourceWaveProvider для формирования входных данных для вашего кодировщика. (не забудьте установить для MemoryStream позицию 0 перед кодированием)

person Mark Heath    schedule 02.06.2013
comment
Спасибо, Марк, это помогло мне, извините за поздний ответ. - person Roman Badiornyi; 11.06.2013