回答
如果別人需要一些代碼來做到這一點這是斯威夫特
func convertAudioFile(sourceURL: CFURLRef, destinationURL:
CFURLRef, outputFormat: OSType ,
outputSampleRate: Float64) -> OSStatus
{
var error : OSStatus = noErr
var destinationFile : ExtAudioFileRef = nil
var sourceFile : ExtAudioFileRef = nil
var srcFormat : AudioStreamBasicDescription = AudioStreamBasicDescription()
var dstFormat : AudioStreamBasicDescription = AudioStreamBasicDescription()
var audioConverter : AudioConverterRef = nil
audioConverter = AudioConverterRef.init()
ExtAudioFileOpenURL(sourceURL, &sourceFile)
var thePropertySize: UInt32 = UInt32(strideofValue(srcFormat))
ExtAudioFileGetProperty(sourceFile, kExtAudioFileProperty_FileDataFormat, &thePropertySize, &srcFormat)
dstFormat.mSampleRate = (outputSampleRate == 0 ? srcFormat.mSampleRate : outputSampleRate) //Set sample rate
dstFormat.mFormatID = outputFormat
dstFormat.mChannelsPerFrame = 1
dstFormat.mBitsPerChannel = 16
dstFormat.mBytesPerPacket = 2 * dstFormat.mChannelsPerFrame
dstFormat.mBytesPerFrame = 2 * dstFormat.mChannelsPerFrame
dstFormat.mFramesPerPacket = 1
dstFormat.mFormatFlags = kLinearPCMFormatFlagIsPacked | kLinearPCMFormatFlagIsSignedInteger // little-endian
//Create destination file
ExtAudioFileCreateWithURL(destinationURL, kAudioFileCAFType, &dstFormat, nil,
AudioFileFlags.EraseFile.rawValue, &destinationFile)
ExtAudioFileSetProperty(sourceFile, kExtAudioFileProperty_ClientDataFormat, thePropertySize, &dstFormat)
ExtAudioFileSetProperty(destinationFile, kExtAudioFileProperty_ClientDataFormat, thePropertySize, &dstFormat)
var size : UInt32 = UInt32(strideofValue(audioConverter))
ExtAudioFileGetProperty(destinationFile, kExtAudioFileProperty_AudioConverter, &size, &audioConverter)
var canResume : UInt32 = 0
size = UInt32(strideofValue(canResume))
error = AudioConverterGetProperty(audioConverter, kAudioConverterPropertyCanResumeFromInterruption, &size, &canResume)
let bufferByteSize : UInt32 = 32768
var srcBuffer = [UInt8](count: 32768, repeatedValue: 0)
var sourceFrameOffset : ULONG = 0
print("Converting audio file")
while(true){
var fillBufList = AudioBufferList(
mNumberBuffers: 1,
mBuffers: AudioBuffer(
mNumberChannels: 2,
mDataByteSize: UInt32(srcBuffer.count),
mData: &srcBuffer
)
)
var numFrames : UInt32 = 0
if(dstFormat.mBytesPerFrame > 0){
numFrames = bufferByteSize/dstFormat.mBytesPerFrame
}
ExtAudioFileRead(sourceFile, &numFrames, &fillBufList)
if(numFrames == 0){
error = noErr;
break;
}
sourceFrameOffset += numFrames
error = ExtAudioFileWrite(destinationFile, numFrames, &fillBufList)
}
ExtAudioFileDispose(destinationFile)
ExtAudioFileDispose(sourceFile)
let audioAsset = AVURLAsset.init(URL: destinationURL, options: nil)
if(audioAsset.duration.seconds < 5.0){
error = -2500
}
return error;
在AVFoundation框架中的AVAssetReader和AVAssetWriter可以用於讀取AAC文件並將該數據寫入iOS設備上的WAV/RIFF文件。 Apple開發人員網站上有示例代碼。這不僅僅是一小段片段。
謝謝使用,這就是我現在正在處理的內容。我將代碼轉換爲Swift,因爲示例代碼使用的是C++。 – O2U
下面是編輯爲@ O2U的answere。由於上述代碼實際上並未將其轉換爲波形文件。請在上面的代碼中使用「kAudioFileWAVEType」而不是「kAudioFileCAFType」在行//Create destination file ExtAudioFileCreateWithURL(destinationURL, kAudioFileCAFType, &dstFormat, nil, AudioFileFlags.EraseFile.rawValue, &destinationFile)
你改變了別的嗎?當我使用'kAudioFileWAVEType'時,沒有設置destinationFile' –
不,沒有改變這個。請檢查您的目標網址是否正確,這可能是目標文件未設置時的問題。 –
只是爲了更新斯威夫特3:
func convertAudio(_ url: URL, outputURL: URL) {
var error : OSStatus = noErr
var destinationFile: ExtAudioFileRef? = nil
var sourceFile : ExtAudioFileRef? = nil
var srcFormat : AudioStreamBasicDescription = AudioStreamBasicDescription()
var dstFormat : AudioStreamBasicDescription = AudioStreamBasicDescription()
ExtAudioFileOpenURL(url as CFURL, &sourceFile)
var thePropertySize: UInt32 = UInt32(MemoryLayout.stride(ofValue: srcFormat))
ExtAudioFileGetProperty(sourceFile!,
kExtAudioFileProperty_FileDataFormat,
&thePropertySize, &srcFormat)
dstFormat.mSampleRate = 44100 //Set sample rate
dstFormat.mFormatID = kAudioFormatLinearPCM
dstFormat.mChannelsPerFrame = 1
dstFormat.mBitsPerChannel = 16
dstFormat.mBytesPerPacket = 2 * dstFormat.mChannelsPerFrame
dstFormat.mBytesPerFrame = 2 * dstFormat.mChannelsPerFrame
dstFormat.mFramesPerPacket = 1
dstFormat.mFormatFlags = kLinearPCMFormatFlagIsPacked |
kAudioFormatFlagIsSignedInteger
// Create destination file
error = ExtAudioFileCreateWithURL(
outputURL as CFURL,
kAudioFileWAVEType,
&dstFormat,
nil,
AudioFileFlags.eraseFile.rawValue,
&destinationFile)
print("Error 1 in convertAudio: \(error.description)")
error = ExtAudioFileSetProperty(sourceFile!,
kExtAudioFileProperty_ClientDataFormat,
thePropertySize,
&dstFormat)
print("Error 2 in convertAudio: \(error.description)")
error = ExtAudioFileSetProperty(destinationFile!,
kExtAudioFileProperty_ClientDataFormat,
thePropertySize,
&dstFormat)
print("Error 3 in convertAudio: \(error.description)")
let bufferByteSize : UInt32 = 32768
var srcBuffer = [UInt8](repeating: 0, count: 32768)
var sourceFrameOffset : ULONG = 0
while(true){
var fillBufList = AudioBufferList(
mNumberBuffers: 1,
mBuffers: AudioBuffer(
mNumberChannels: 2,
mDataByteSize: UInt32(srcBuffer.count),
mData: &srcBuffer
)
)
var numFrames : UInt32 = 0
if(dstFormat.mBytesPerFrame > 0){
numFrames = bufferByteSize/dstFormat.mBytesPerFrame
}
error = ExtAudioFileRead(sourceFile!, &numFrames, &fillBufList)
print("Error 4 in convertAudio: \(error.description)")
if(numFrames == 0){
error = noErr;
break;
}
sourceFrameOffset += numFrames
error = ExtAudioFileWrite(destinationFile!, numFrames, &fillBufList)
print("Error 5 in convertAudio: \(error.description)")
}
error = ExtAudioFileDispose(destinationFile!)
print("Error 6 in convertAudio: \(error.description)")
error = ExtAudioFileDispose(sourceFile!)
print("Error 7 in convertAudio: \(error.description)")
}
太棒了!謝謝!希望我可以投票10次。 –
除了使用kAudioFileMP3Type以外,還有其他更改導出到MP3嗎?我在錯誤= ExtAudioFileSetProperty(destinationFile!)時遇到了錯誤=使用MP3類型 – miOS
您可能需要嘗試不同的mFormatFlags。您會注意到,除了kAudioFileMP3Type之外,這是一個與已接受的答案之間的區別。 – MScottWaller
- 1. 轉換.M4A爲.wav
- 2. 如何將WAV文件轉換爲M4A?
- 3. 將M4a轉換爲Mp3
- 4. 將一段iOS代碼轉換爲Android
- 5. 將iOS代碼轉換爲Android,OpenCV
- 6. 將OpenCV代碼從iOS轉換爲Android
- 7. 將wav文件轉換爲wav文件
- 8. 將wav轉換爲mp3並轉換爲wav
- 9. Python將wav轉換爲mp3
- 10. 將.mat轉換爲.wav
- 11. 將WAV轉換爲MP3
- 12. 將AAC轉換爲WAV
- 13. 將wav轉換爲wma
- 14. iPhone - 將mp3轉換爲wav?
- 15. 將.wav轉換爲數組
- 16. 使用libavcodec將.m4a轉換爲PCM
- 17. Ionic/Cordova - 將m4a文件轉換爲flac
- 18. 將AAC音頻格式轉換爲M4A
- 19. 將線性PCM文件轉換爲iOS中的M4A文件
- 20. 無法使用sox將特定.wav文件轉換爲mp3或m4a,avconv
- 21. 將VB6代碼轉換爲PHP轉換
- 22. 將xml轉換爲代碼
- 23. 將代碼轉換爲POST
- 24. 將代碼轉換爲RequireJS
- 25. 將ASTNode轉換爲代碼
- 26. 將代碼轉換爲lambda
- 27. 將UML轉換爲代碼
- 28. 將代碼轉換爲constexpr
- 29. 將代碼轉換爲python
- 30. 將Java代碼轉換爲C#代碼
看到這一次可能是它可以幫助你http://stackoverflow.com/questions/31452202/ios-swift-merge-and-convert-wav-files-to-mp3 –