用于同步/异步分块音频流的简单音频播放器。
您可以通过将 swift-chunked-audio-player
添加为软件包到您的 Xcode 项目中。
如果您想在 SwiftPM 项目中使用 swift-chunked-audio-player
,只需将其添加到您的 Package.swift
中即可
dependencies: [
.package(url: "https://github.com/mihai8804858/swift-chunked-audio-player", from: "1.0.0")
]
然后将该产品添加到任何需要访问该库的目标中
.product(name: "ChunkedAudioPlayer", package: "swift-chunked-audio-player"),
ChunkedAudioPlayer
使用以下方法来流式传输实时音频
AudioStreamBasicDescription
并使用 AudioFileStreamOpen(_)
和 AudioFileStreamParseBytes(_)
将数据块拆分为音频包CMSampleBuffer
AVSampleBufferAudioRenderer
和 AVSampleBufferRenderSynchronizer
排队并播放 sample bufferAudioPlayer
的实例private let player = AudioPlayer()
AsyncThrowableStream
或 AnyPublisher
)let stream = AsyncThrowableStream<Data, Error> = ...
// type parameter is optional, but recommended (if the stream type is known)
player.start(stream, type: kAudioFileMP3Type)
player.$currentState.sink { state in
// handle player state
}.store(in: &bag)
player.$currentRate.sink { rate in
// handle player rate
}.store(in: &bag)
player.$currentDuration.sink { duration in
// handle player duration
}.store(in: &bag)
player.$currentTime.sink { time in
// handle player time
}.store(in: &bag)
player.$currentError.sink { error in
if let error {
// handle player error
}
}.store(in: &bag)
// Set stream volume
player.volume = 0.5
// Set muted
player.isMuted = true
// Set stream rate
player.rate = 0.5
// Pause current stream
player.pause()
// Resume current stream
player.resume()
// Stop current stream
player.stop()
// Rewind 5 seconds
player.rewind(CMTime(seconds: 5.0, preferredTimescale: 1000))
// Forward 5 seconds
player.forward(CMTime(seconds: 5.0, preferredTimescale: 1000))
// Seek to specific time
player.seek(to: CMTime(seconds: 60, preferredTimescale: 1000))
AudioPlayer
遵循 ObservableObject
协议,因此可以轻松集成到 SwiftUI View
中,并在属性更改时自动更新 UI
struct ContentView: View {
@ObservedObject private var player = AudioPlayer()
var body: some View {
Text("State \(player.currentState)")
Text("Rate \(player.currentRate)")
Text("Time \(player.currentTime)")
Text("Duration \(player.currentDuration)")
if let error = player.currentError {
Text("Error \(error)")
}
}
}
此库在 MIT 许可证下发布。有关详细信息,请参阅 LICENSE。