2016-10-04 83 views
0

我試圖執行下面的代碼,我發現here使用NAudio,ADTS AAC進行WAV轉碼,怎麼樣?

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])。 我正在運行編譯後的代碼作爲控制檯應用程序,但我沒有得到任何錯誤,但它似乎掛起一旦它創建了0 KB大小的wav文件

我想知道是否有我丟失的東西或也許我需要進一步理解。

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

我要在這裏補充上述信息的下部分不正確,我相信。 採樣率不是96k它是22050並且只有1個通道

回答

0

您不需要重採樣器 - MediaFoundationReader已經返回PCM。您還應該使用WaveFileWriter.CreateWaveFile

這應該是所有你需要:

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

馬克,有趣的是,返回的wav文件數據在字節位置46,而不是44開頭我認爲這是由於子塊大小之中18而不是16.你能詳細說明爲什麼會出現這種情況,請詳細說明額外2字節的用途嗎? – Majickal

+1

這是WAVEFORMAT和WAVEFORMATEX的區別 –

+0

好的,謝謝,所以我們省略了WAVEFORMAT中的cbSize和額外數據,而不是[WAVEFORMATEX](https://wiki.multimedia.cx/index.php?title=WAVEFORMATEX)那些價值在哪裏。最近我看到了許多不同的標題長度,特別是從FFMPEG(aac> wav)的輸出中我注意到由於元數據導致的偏移量爲76字節。現在有道理。隊友的歡呼聲。 – Majickal