Meine App muss eine Audiodatei generieren und ich schreibe den Dateigenerator nach meiner letzten Android-Version. Auf Android verwendet es OKIO, um mit IO und iOS umzugehen, es verwendet die nativen NSData.Falsche Bytes erzeugt, um WAV-Datei zu erstellen
Jede WAV-Datei benötigt eine Kopfzeile, um einige Parameter für den Datenleser (Media Player) zu informieren.
Es verwendet diesen Dateigenerator, Bytes schreiben, die einigen Spezifikationen folgen, die auf dem Internet zur Verfügung gestellt werden.
//Audio file content, this variable will be used
//to storage the audio data (PCM).
var content = [UInt8]() //This is not empty.
var fileSize: Int = 0 //this is not zero.
//Total size of the file, with the header.
let totalFileSize = fileSize + HEADER_SIZE
//Header data
let header = NSMutableData()
//RIFF
header.append([UInt8]("RIFF".utf8), length: 4)
//Size of the entity file
header.append(Data(bytes: readInt(Int32(totalFileSize).littleEndian)))
//WAVE
header.append([UInt8]("WAVE".utf8), length: 4)
//FMT
header.append([UInt8]("fmt ".utf8), length: 4)
//BITRATE
header.append(Data(bytes: readInt(BITRATE.littleEndian)))
//Audio format
var audioFormat = AUDIO_FORMAT_PCM.littleEndian
header.append(&audioFormat, length: 2)
//Number of channels
var audioChannels = CHANNELS.littleEndian
header.append(&audioChannels, length: 2)
//Sample rate
var sampleRate = SAMPLE_RATE.littleEndian
header.append(&sampleRate, length: 4)
//Byte rate
var byteRate = ((SAMPLE_RATE*UInt32(CHANNELS)*UInt32(BYTES_PER_SAMPLE))/UInt32(8)).littleEndian
header.append(&byteRate, length: 4)
//Block align
var blockAlign = (UInt16(CHANNELS) * UInt16(BYTES_PER_SAMPLE)/UInt16(8)).littleEndian
header.append(&blockAlign, length: 2)
//Bytes per sample
var bytesPerSample = BYTES_PER_SAMPLE.littleEndian
header.append(&bytesPerSample, length: 2)
//Data
header.append([UInt8]("data".utf8), length: 4)
//Size of the audio data
var sizeLittleEndian = UInt32(fileSize).littleEndian
header.append(&sizeLittleEndian, length: 4)
print(header.length) //44
Es nutzt diese Methode Int auf den Puffer zu schreiben:
func readInt(_ i: Int32) -> [UInt8] {
return [UInt8(truncatingBitPattern: (i >> 24) & 0xff),
UInt8(truncatingBitPattern: (i >> 16) & 0xff),
UInt8(truncatingBitPattern: (i >> 8) & 0xff),
UInt8(truncatingBitPattern: (i ) & 0xff)]
}
Auf Android, wird die Datei ohne Probleme erzeugt werden. Aber auf iOS sind diese 2 Parameter falsch. Schauen Sie (die meisten Top-Datei generiert auf Android-Code und der Unterseite von iOS-Code generiert wurde):
Swift 3
Ich weiß wirklich nicht, was passiert ist, können Sie mir helfen?
Haben Sie das jemals gelöst? – astromme
Ja :) Gelöst !! –
Können Sie die Antwort hier posten? – astromme