Launch-Aktion: Die Pläne Creator und Business sind für begrenzte Zeit rabattiert. Preise ansehen

Mobile-Integration

Nutzen Sie die ADN-API mit Client-Side-API-Keys aus Ihrer iOS-, Android- oder Flutter-App. Wiedergabe und Upload mit nativen Medienelementen.

Ideal für

iOS-, Android- und Flutter-Apps. Die Einrichtung dauert etwa 30 Minuten.

Tracks abspielen

Erstellen Sie Wiedergabesessions und streamen Sie Audio mit nativen Medienplayern.

Rufen Sie die Wiedergabe-API von ADN direkt aus Ihrer mobilen App mit einem Client-Side-API-Key auf. Erstellen Sie Wiedergabesessions, rufen Sie signierte Varianten-URLs ab und streamen Sie Audio mit nativen Medienplayern.

1. Client-Side-Player-API-Key erstellen

Erstellen Sie unter Settings → API Keys einen Client-Side Player-Key. Beschränken Sie ihn auf die Varianten und Inhalte, auf die Ihre mobile App zugreifen soll.

2. Wiedergabesession erstellen

import Foundation

struct PlaySessionRequest: Encodable {
    let collectionId: String
    let variants: [String]
    let isDownloadable: Bool
    let expiresIn: Int
    enum CodingKeys: String, CodingKey {
        case collectionId = "collection_id"; case variants
        case isDownloadable = "is_downloadable"; case expiresIn = "expires_in"
    }
}
struct PlaySessionResponse: Decodable {
    let playSessionId: String
    let tracks: [Track]
    enum CodingKeys: String, CodingKey { case playSessionId = "play_session_id"; case tracks }
    struct Track: Decodable { let id: String }
}

func createPlaySession() async throws -> (playSessionId: String, tracks: [PlaySessionResponse.Track]) {
    var request = URLRequest(url: URL(string: "https://api.audiodelivery.net/v1/play_session/collection")!)
    request.httpMethod = "POST"
    request.setValue("Bearer CLIENT-SIDE-PLAYER-API-KEY", forHTTPHeaderField: "Authorization")
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    let encoder = JSONEncoder()
    encoder.keyEncodingStrategy = .convertToSnakeCase
    request.httpBody = try encoder.encode(PlaySessionRequest(
        collectionId: "COLLECTION-ID", variants: ["hq", "lq"], isDownloadable: false, expiresIn: 3600))
    let (data, _) = try await URLSession.shared.data(for: request)
    let decoder = JSONDecoder()
    decoder.keyDecodingStrategy = .convertFromSnakeCase
    let session = try decoder.decode(PlaySessionResponse.self, from: data)
    return (session.playSessionId, session.tracks)
}

3. Track-Varianten-URLs abrufen

struct TrackVariantsResponse: Decodable {
    let variants: [Variant]
    struct Variant: Decodable {
        let url: String
        let variant: VariantIndex
        struct VariantIndex: Decodable { let id: String }
    }
}

// No auth needed — the session ID acts as a bearer token
func getAudioUrl(playSessionId: String, trackId: String) async throws -> String {
    let url = URL(string: "https://api.audiodelivery.net/v1/play/\(playSessionId)/\(trackId)")!
    let (data, _) = try await URLSession.shared.data(from: url)
    let decoder = JSONDecoder()
    decoder.keyDecodingStrategy = .convertFromSnakeCase
    let res = try decoder.decode(TrackVariantsResponse.self, from: data)
    let hq = res.variants.first { $0.variant.id == "hq" }!
    return hq.url
}

4. Mit nativem Player abspielen

import AVFoundation

let player = AVPlayer(url: URL(string: audioUrl)!)
player.play()

Die signierte URL funktioniert mit jedem nativen Medienplayer. ADN übernimmt die CDN-Auslieferung und die URL-Verifizierung.

Wellenform-Daten

ADN erzeugt automatisch normalisierte RMS-Wellenform-Daten (320 Samples) für jeden Track. Das Feld levels in der Track-Antwort enthält die Daten — nutzen Sie sie, um Wellenformen in Ihrem eigenen Player darzustellen, oder erzeugen Sie individuelle Wellenformen über den Audio-Analyse-Variantentyp.

Coverbilder & Theme-Farben

ADN scannt jeden hochgeladenen Track auf eingebettetes Cover-Artwork und stellt es als cover_image in der Track-Antwort bereit (in den Größen icon/small/regular/large). Sie können ein Coverbild auch separat über die API hochladen. Wenn ein Coverbild vorhanden ist, extrahiert ADN eine Farbpalette und wählt eine primäre player_color — nutzen Sie diese, um Ihre Player-UI zu stylen. Zusätzlich enthalten Antworten player_color_light und player_color_dark, kontrastangepasste Varianten zum Darstellen der Farbe auf hellem bzw. dunklem Hintergrund. Das vollständige theme-Array enthält alle extrahierten Farben mit Hex-Werten, Fläche, Helligkeit und Sättigungsdaten.

Tracks hochladen

Laden Sie Audiodateien aus nativen Apps mit der Upload-API von ADN hoch.

Rufen Sie die Upload-API von ADN direkt aus Ihrer mobilen App mit einem Client-Side-API-Key auf. Erstellen Sie Upload-Sessions, erhalten Sie vorsignierte URLs und laden Sie Audiodateien hoch — alles aus nativem Code.

1. Client-Side-Upload-API-Key erstellen

Melden Sie sich bei ADN an, gehen Sie zu Settings → API Keys und erstellen Sie einen Client-Side Upload-Key. Beschränken Sie ihn auf die Sammlung, in die Ihre App hochladen soll.

2. Upload-Session erstellen

import Foundation

struct UploadSessionRequest: Encodable {
    let collectionId: String
    let expiresIn: Int
    enum CodingKeys: String, CodingKey { case collectionId = "collection_id"; case expiresIn = "expires_in" }
}
struct UploadSessionResponse: Decodable {
    let uploadSession: UploadSession
    enum CodingKeys: String, CodingKey { case uploadSession = "upload_session" }
    struct UploadSession: Decodable { let id: String }
}

func createUploadSession() async throws -> String {
    var request = URLRequest(url: URL(string: "https://api.audiodelivery.net/v1/upload_session")!)
    request.httpMethod = "POST"
    request.setValue("Bearer CLIENT-SIDE-UPLOAD-API-KEY", forHTTPHeaderField: "Authorization")
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    let encoder = JSONEncoder()
    encoder.keyEncodingStrategy = .convertToSnakeCase
    request.httpBody = try encoder.encode(UploadSessionRequest(collectionId: "COLLECTION-ID", expiresIn: 3600))
    let (data, _) = try await URLSession.shared.data(for: request)
    let decoder = JSONDecoder()
    decoder.keyDecodingStrategy = .convertFromSnakeCase
    let session = try decoder.decode(UploadSessionResponse.self, from: data)
    return session.uploadSession.id
}

3. Track-Upload-URL abrufen

struct TrackUploadRequest: Encodable {
    let fileName: String
    enum CodingKeys: String, CodingKey { case fileName = "file_name" }
}
struct TrackUploadResponse: Decodable {
    let trackUpload: TrackUpload
    enum CodingKeys: String, CodingKey { case trackUpload = "track_upload" }
    struct TrackUpload: Decodable { let uploadUrl: String; let method: String
        enum CodingKeys: String, CodingKey { case uploadUrl = "upload_url"; case method }
    }
}

func getTrackUploadUrl(sessionId: String) async throws -> (url: String, method: String) {
    var request = URLRequest(url: URL(string: "https://api.audiodelivery.net/v1/upload/\(sessionId)/track")!)
    request.httpMethod = "POST"
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    let encoder = JSONEncoder()
    encoder.keyEncodingStrategy = .convertToSnakeCase
    request.httpBody = try encoder.encode(TrackUploadRequest(fileName: "recording.m4a"))
    let (data, _) = try await URLSession.shared.data(for: request)
    let decoder = JSONDecoder()
    decoder.keyDecodingStrategy = .convertFromSnakeCase
    let res = try decoder.decode(TrackUploadResponse.self, from: data)
    return (res.trackUpload.uploadUrl, res.trackUpload.method)
}

4. Datei hochladen

// Prefer streaming for large files instead of loading into memory
func uploadAudio(fileURL: URL, uploadURL: URL, method: String) async throws {
    var request = URLRequest(url: uploadURL)
    request.httpMethod = method
    request.setValue("audio/mp4", forHTTPHeaderField: "Content-Type")
    request.httpBodyStream = InputStream(url: fileURL)
    let (_, uploadResponse) = try await URLSession.shared.data(for: request)
    let httpResponse = uploadResponse as! HTTPURLResponse
    print("Upload status: \(httpResponse.statusCode)") // 200 on success
}

Wiederholen Sie Schritt 3 und 4 für jede Datei — jeder Track benötigt seine eigene Upload-Anfrage und seine eigene signierte URL. Sie können auch ein verschachteltes track-Objekt bei der Session-Erstellung mitsenden, um den ersten Track direkt zu erstellen, und dann Schritt 3 für weitere Dateien nutzen.

5. Warten, bis der Track bereit ist

Die Verarbeitung beginnt automatisch nach dem Upload. Warten Sie, bevor Sie den Track abspielen, bis er bereit ist — fragen Sie GET /v1/track/{track_id} ab, bis track.track_status_id den Wert ready hat, oder konfigurieren Sie einen Webhook (nächster Schritt), um statt Polling benachrichtigt zu werden.

6. Optional: Webhooks

Fügen Sie unter Settings → Webhook einen Webhook hinzu, um benachrichtigt zu werden, wenn ein Track ein terminales Ergebnis erreicht (ready, incomplete, error oder init_error) und wenn sein vollständiger Dateisatz fertig ist. Siehe die Docs zum Track-Processing-Webhook.

Coverbilder

ADN scannt hochgeladene Tracks automatisch auf eingebettetes Cover-Artwork. Sie können ein Coverbild auch separat über die Covers-API hochladen. Wenn ein Bild vorhanden ist, extrahiert ADN Farben (verfügbar als theme), die zum Stylen Ihrer Player-UI verwendet werden können.