2016-10-04 4 views
0

Я пытаюсь реализовать следующий код, который я нашел hereИспользование NAudio, ADTS AAC для WAV Transcoding, как?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Media; 
using NAudio.Wave; 


namespace AAC2WAV 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      // create media foundation reader to read the AAC encoded file 
      using (MediaFoundationReader reader = new MediaFoundationReader(args[0])) 
      // resample the file to PCM with same sample rate, channels and bits per sample 
      using (ResamplerDmoStream resampledReader = new ResamplerDmoStream(reader, 
       new WaveFormat(reader.WaveFormat.SampleRate, reader.WaveFormat.BitsPerSample, reader.WaveFormat.Channels))) 
      // create WAVe file 
      using (WaveFileWriter waveWriter = new WaveFileWriter(args[1], resampledReader.WaveFormat)) 
      { 
       // copy samples 
       resampledReader.CopyTo(waveWriter); 
      } 

     } 
    } 
} 

входной файл * .aac (арг [0]) Выходной файл должен быть * .wav (арг [1]). Я запускаю выполненный код в качестве консольного приложения, и я не получаю никаких ошибок, однако он просто кажется зависающим, когда он создает файл wav с размером 0 КБ.

Мне интересно, есть ли что-то, что мне не хватает или возможно, кое-что, что мне нужно для дальнейшего понимания.

Windows сообщает файлы * .aac как ADTS.

Возможно, мне нужно извлечь и переписать заголовок, но я вообще не знаком с AAC, поэтому хотел бы найти какое-то руководство по этому аспекту, если сочтет это необходимым.

Когда я пытаюсь открыть файл с помощью WMP, он говорит, что он не может подключиться к серверу (предлагает проблему с кодеком), однако я могу без проблем конвертировать его с FFMPEG в wav-файл. Использование FFMPEG не идеально подходит для конкретной реализации, на которую я смотрю.

Любая помощь будет принята с благодарностью.


Информация о фактическом файле:

General 
Complete name : C:\Users\....\AAC2WAV\bin\Debug\0cc409aa-f66c-457a-ac10-6286509ec409.aac 
Format : ADIF 
Format/Info : Audio Data Interchange Format 
File size : 180 KiB 
Overall bit rate mode : Constant 

Audio 
Format : AAC 
Format/Info : Advanced Audio Codec 
Format profile : Main 
Bit rate mode : Constant 
Channel(s) : 14 channels 
Channel positions : , Back: 14 
Sampling rate : 96.0 kHz 
Frame rate : 93.750 FPS (1024 spf) 
Compression mode : Lossy 
Stream size : 180 KiB (100%) 

Информация, собранная из файла с помощью: MediaInfo

Я должен добавить, что нижняя часть выше информация неверна я считаю. Частота дискретизации не равна 96 Кб, а есть только 1 канал

ответ

0

Вам не нужен ресамплер - MediaFoundationReader уже возвращает PCM. Вы должны также использовать WaveFileWriter.CreateWaveFile

Это должно быть все, что вам нужно:

using (var reader = new MediaFoundationReader("myfile.aac")) 
{ 
    WaveFileWriter.CreateWaveFile("pcm.wav", reader); 
} 
+0

Марк, Интересно, что возвращаемые данные WAV файл начинается в положении байта 46, а не 44. Я вижу, что это из-за размера subchunk существа 18, а не 16. Можете ли вы объяснить, почему это так, и где используются дополнительные 2 байта? – Majickal

+1

Это разница между WAVEFORMAT и WAVEFORMATEX –

+0

ОК, спасибо, поэтому мы опускаем cbSize и дополнительные данные в WAVEFORMAT, а не в [WAVEFORMATEX] (https://wiki.multimedia.cx/index.php?title=WAVEFORMATEX) где эти значения присутствуют. Недавно я видел несколько разных длин заголовков, в частности, из вывода FFMPEG (aac> wav), где я заметил смещение 76 байтов из-за метаданных. Теперь имеет смысл. Приветственный помощник. – Majickal

Смежные вопросы