簡體   English   中英

如何使用iOS SDK(核心音頻)僅將原始PCM保存到文件?

[英]How to save just raw PCM to file with iOS SDK (Core Audio)?

我正在將MP3文件轉換為原始PCM,我需要將其保存為原始PCM。 (請注意,我正在使用Java / RoboVM移植到iOS。)

我正在使用coreaudio程序包,代碼的相關部分如下所示:

// Define the output PCM format.
AudioStreamBasicDescription outputFormat = new AudioStreamBasicDescription();
outputFormat.setFormat(AudioFormat.LinearPCM);
outputFormat.setFormatFlags(AudioFormatFlags.Canonical);
outputFormat.setBitsPerChannel(16);
outputFormat.setChannelsPerFrame(1);
outputFormat.setFramesPerPacket(1);
outputFormat.setBytesPerFrame(2);
outputFormat.setBytesPerPacket(2);
outputFormat.setSampleRate(22050);

// ...

outputFile = ExtAudioFile.create(outputFileURL, AudioFileType.CAF, outputFormat, null, AudioFileFlags.EraseFile);

然后,我運行一個循環,從MP3文件讀取並寫入輸出文件。

在將此原始文件導入Audacity時,我注意到它始終在開始時出現尖峰,這表明它實際上不是原始PCM文件,而是位於帶有標頭的包裝器內(無論是WAV還是CAF標頭,等等)。

我知道我可以取出文件並剝離標題並獲取原始PCM數據,但是就我的應用程序這一部分的空間/性能而言,我希望我能使其簡單並保存原始PCM。數據沒有包裝,但是我不知道該怎么做。


問題出現在這里:

outputFile = ExtAudioFile.create(outputFileURL, AudioFileType.CAF, outputFormat, null, AudioFileFlags.EraseFile);

AudioFileType沒有太多選擇,我已經嘗試過WAVECAF了 理想情況下,會有PCMRAW選項,但沒有。 我是否應該選擇特定的AudioFileType ,還是需要以其他方式進行?

extended audio file services框架不支持“原始” PCM格式。

為了使應用程序了解PCM格式,它需要了解以下數據內容:

  • 有多少個頻道
  • 他們是否交錯
  • 采樣率是多少
  • 數據是否浮點
  • 什么是位深度
  • 等等...

實際上,在iOSOS XAudioStreamBasicDescription是一個結構,可告訴您解釋PCM流所需的內容。 因此,“原始PCM”格式實際上並沒有用,它至少需要一些元數據。 與原始PCM最接近的格式是WAVAIFFCAF 如果這些都不符合您的目的,則必須創建自定義文件格式。 但這並不需要困難。


extended audio file services API相當可配置。 打開要讀取的音頻文件( ExtAudioFileOpenURL )之后,可以在ExtAudioFileRef句柄上設置各種屬性。

在您的情況下,請考慮設置kExtAudioFileProperty_ClientDataFormat 此屬性控制從文件讀取的PCM數據的格式。 ExtAudioFileRead解碼輸入文件時,會將發送的數據轉換回您指定的格式。 此方法有一些限制。 IIRC,它不支持進行采樣率轉換等操作。

當您讀取正確解碼的數據時,可以使用諸如NSOutputStream類的方法將NSOutputStream的“原始PCM”格式直接寫入根本沒有元數據的文件中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM