Files
MobileMusicAssistant/Mobile Music Assistant/DocsAudioStreamingIntegration.md
T
2026-03-27 09:21:41 +01:00

3.7 KiB

Music Assistant Audio Streaming Integration

Übersicht

Um Audio vom Music Assistant Server auf dem iPhone abzuspielen, müssen wir:

  1. Stream-URL vom Server anfordern
  2. AVPlayer mit dieser URL konfigurieren
  3. Playback-Status zum Server zurückmelden

Stream-URL erhalten

API Call: player_queues/cmd/get_stream_url

func getStreamURL(queueId: String, queueItemId: String) async throws -> URL {
    let response = try await webSocketClient.sendCommand(
        "player_queues/cmd/get_stream_url",
        args: [
            "queue_id": queueId,
            "queue_item_id": queueItemId
        ]
    )
    
    guard let result = response.result,
          let urlString = result.value as? String,
          let url = URL(string: urlString) else {
        throw ClientError.serverError("Invalid stream URL")
    }
    
    return url
}

Beispiel Stream-URL Format

http://MA_SERVER:8095/api/stream/<queue_id>/<queue_item_id>

Implementierungsschritte

1. Stream-URL in MAService hinzufügen

// In MAService.swift
func getStreamURL(queueId: String, queueItemId: String) async throws -> URL {
    let response = try await webSocketClient.sendCommand(
        "player_queues/cmd/get_stream_url",
        args: [
            "queue_id": queueId,
            "queue_item_id": queueItemId
        ]
    )
    
    guard let result = response.result else {
        throw MAWebSocketClient.ClientError.serverError("No result")
    }
    
    // Try to extract URL from response
    if let urlString = result.value as? String,
       let url = URL(string: urlString) {
        return url
    }
    
    throw MAWebSocketClient.ClientError.serverError("Invalid stream URL format")
}

2. Integration in MAAudioPlayer

// In MAAudioPlayer.swift
func playQueueItem(_ item: MAQueueItem, queueId: String) async throws {
    logger.info("Playing queue item: \(item.name)")
    
    // Get stream URL from server
    let streamURL = try await service.getStreamURL(
        queueId: queueId,
        queueItemId: item.queueItemId
    )
    
    // Load and play
    loadAndPlay(item: item, streamURL: streamURL)
}

3. Status-Updates zum Server senden

// Player-Status synchronisieren
func syncPlayerState() async throws {
    try await service.webSocketClient.sendCommand(
        "players/cmd/update_state",
        args: [
            "player_id": "ios_device",
            "state": isPlaying ? "playing" : "paused",
            "current_time": currentTime,
            "volume": Int(volume * 100)
        ]
    )
}

Format-Unterstützung

AVPlayer unterstützt nativ:

  • MP3
  • AAC
  • M4A
  • WAV
  • AIFF
  • HLS Streams

Für FLAC benötigt man:

  • ⚠️ Server-seitige Transcoding (MA kann das automatisch)
  • 🔧 Oder: Third-party Decoder (z.B. via AudioToolbox)

Authentifizierung für Stream-URLs

Stream-URLs erfordern möglicherweise den Auth-Token:

var request = URLRequest(url: streamURL)
if let token = service.authManager.currentToken {
    request.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
}

let playerItem = AVPlayerItem(asset: AVURLAsset(url: streamURL, options: [
    "AVURLAssetHTTPHeaderFieldsKey": request.allHTTPHeaderFields ?? [:]
]))

Nächste Schritte

  1. Implementiere getStreamURL() in MAService
  2. Update MAAudioPlayer.playQueueItem()
  3. Teste mit verschiedenen Audio-Formaten
  4. Implementiere Player-State-Sync zum Server
  5. Handle Netzwerk-Fehler & Buffering

Referenzen