[英]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沒有太多選擇,我已經嘗試過WAVE和CAF了 。 理想情況下,會有PCM或RAW選項,但沒有。 我是否應該選擇特定的AudioFileType
,還是需要以其他方式進行?
extended audio file services
框架不支持“原始” PCM格式。
為了使應用程序了解PCM格式,它需要了解以下數據內容:
實際上,在iOS
和OS X
, AudioStreamBasicDescription
是一個結構,可告訴您解釋PCM流所需的內容。 因此,“原始PCM”格式實際上並沒有用,它至少需要一些元數據。 與原始PCM最接近的格式是WAV
, AIFF
和CAF
。 如果這些都不符合您的目的,則必須創建自定義文件格式。 但這並不需要困難。
extended audio file services
API相當可配置。 打開要讀取的音頻文件( ExtAudioFileOpenURL
)之后,可以在ExtAudioFileRef
句柄上設置各種屬性。
在您的情況下,請考慮設置kExtAudioFileProperty_ClientDataFormat
。 此屬性控制從文件讀取的PCM數據的格式。 ExtAudioFileRead
解碼輸入文件時,會將發送的數據轉換回您指定的格式。 此方法有一些限制。 IIRC,它不支持進行采樣率轉換等操作。
當您讀取正確解碼的數據時,可以使用諸如NSOutputStream
類的方法將NSOutputStream
的“原始PCM”格式直接寫入根本沒有元數據的文件中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.