Ein Video ersetzen
  • 23 Apr 2025

Ein Video ersetzen


Artikel-Zusammenfassung

Ein Video ersetzen

Sie können die REST-API nicht nur zum Hochladen von Videos verwenden, sondern auch zum Ersetzen eines vorhandenen Videos.

Ähnlich wie beim Video-Upload wird auch beim Ersetzen von Videos Chunking verwendet. Beachten Sie, dass das Video dieselben Metadaten, Channel-ID und Gruppen-ID behält.

Um eine vorhandene Videoentität zu ersetzen, erstellen Sie eine neue Videoquelle.

Anschließend erhalten Sie die Upload-URL, die für das Hochladen des Ersatzvideos erforderlich ist.

Schritte

Um ein Video über die REST-API zu ersetzen, folgen Sie den unten aufgeführten Schritten. Während der erste Schritt über die API ausgeführt wird, erfolgt der Upload über einen separaten Endpunkt des Asset-Managements.

  1. Erstellen einer Videoquelle in einem angegebenen VideoManager

  2. Hochladen eines Videos

In den folgenden Kapiteln wird beschrieben, wie die einzelnen Schritte mithilfe von cURL ausgeführt werden, um die Verwendung in den Beispielen zu veranschaulichen.

Die URLs in den Methoden in den folgenden Kapiteln beziehen sich auf die allgemeine Live-Instanz von movingimage. Kunden, die VideoManager Pro auf einer benutzerdefinierten Domain verwenden, müssen die URLs entsprechend anpassen.

Erstellen einer Videoquelle

Um eine Videoentität zu ersetzen, müssen Sie zunächst eine neue Videoquelle erstellen. Dies kann mit dem folgenden cURL-Befehl erfolgen:

curl --location 'https://api.video-cdn.net/v1/vms/<VideoManager_ID>/videos/<VIDEO_ID>/source' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer Token' \
--data '{
    "uploadFilename": "fileName.mp4",
    "file": {
        "fileName": "fileName.mp4",
        "size": 7378888
    }
}'

Alternativ können Sie auch folgende URL verwenden

https://api.video-cdn.net/v1/vms/<VIDEOMANAGER_ID>/videos/<VIDEO_ID>/source

Parameters

Data Type

Description

VIDEOMANAGER_ID

Integer

obligatorisch: ID des VideoManagers, in den Sie das Video hochladen möchten.

Headers

Authorization: Bearer Token

String

obligatorisch: Zugriffstoken (siehe Authentifizierung für weitere Informationen).

JSON Body

uploadFileName

String

obligatorisch: Name der hochzuladenden Datei

file

obligatorisch

fileName

String

obligatorisch: Dateiname des Videos (siehe Suffix-Hinweis unten), verschachtelte Eigenschaft der Datei

size

String

obligatorisch: Größe der Datei, verschachtelte Eigenschaft der Datei

Suffix des Dateinamens

Das Suffix des Dateinamens wird zur Bestimmung des Mimetyps verwendet. In der folgenden Tabelle sind alle unterstützten Suffixe aufgeführt.

Suffix

Mime Type

mp4

video/ mp4

mov

video/quicktime

flv

video/x-flv

wmv

video/x-ms-wmv

mpg

video/mpeg

avi

video/x-msvideo

mp3

audio/mpeg

mpeg

video/mpeg

m4v

video/x-m4v

vob

video/mpeg

f4v

video/x-flv

wav

audio/vnd.wave

3gp

video/3gpp

rm

audio/x-pn-realaudio

mts

video/mpeg

m2v

video/mpeg

wma

audio/x-ms-wma

mxf

application/mxf

m2p

video/mpeg

m2t

video/mpeg

mkv

video/x-matroska

webm

video/webm

qt

video/quicktime

mp2

audio/mpeg

m2ts

video/mpeg

ogv

video/ogg

Response

Die Standortdaten des Antwort-Headers geben eine URL zurück, die die neu erstellte Video-ID enthält. Sie benötigen diese Video-ID für den nächsten Schritt.

location: https://asset-in.video-cdn.net/chunks/env/prod/vms/<VideoManager_ID>/videos/<VIDEO_ID>?bucketId=<BUCKET_ID>&fileId=<FILE_ID>&userId=<USERID>&__token__=<SECURITY_TOKEN>

Parameter

Data Type

Description

VIDEOMANAGER_ID

Integer

ID des VideoManagers, in den Sie das Video hochladen möchten.

VIDEO_ID

String

Video-ID der Videoeinheit

BUCKET_ID

String

Primäre Bucket-ID der Videodatei

FILE_ID

String

Datei-ID der neuen Videodatei

USER_ID

String

ID des Benutzers, der die Datei hochlädt

SECURITY_TOKEN

String

Zugriffstoken für den Zugriff auf geschützte Ressourcen

Hochladen eines Ersatzvideos

Nachdem Sie die URL für den Ersatz-Upload generiert haben, können Sie nun Ihr Video ersetzen. Dies geschieht mit der Chunked-Upload-Methode mit Retry-Handling.

Token-Gültigkeit

Das Token in der Upload-URL ist vier Stunden lang gültig. Das bedeutet, dass ein Fehler auftritt, wenn das Hochladen des Videos länger als vier Stunden dauert. Führen Sie in diesem Fall die Anforderung „Get upload URL“ erneut aus, um eine neue Upload-URL zu generieren.

Chunked Upload

Beispiel

curl --location 'https://asset-in.video-cdn.net/chunks/env/prod/vms/<VideoManager_ID>/videos/<VIDEO_ID>?
bucketId=<BUCKET_ID>&fileId=<FILE_ID>&userId=<USERID>&__token__=<SECURITY_TOKEN>' \
--header 'Content-Type: application/octet-stream' \
--header 'Mi24-Upload-Current-Chunk: 1' \
--header 'Mi24-Upload-Total-Chunks: 1' \
--data '@/Users/<USERNAME>/Downloads/<FILE_NAME>.mp4'

URL

Beschreibung

UPLOAD_URL

Die vollständige Upload-URL (siehe Abrufen der Upload URL) aus dem vorherigen Schritt. Beachten Sie, dass das Sicherheits-Token als Parameter enthalten sein muss.

Header

Mi24-Upload-Total-Chunks

Gesamtzahl der Chunks. Das obige Beispiel verwendet 1 Chunk.

Mi24-Upload-Current-Chunk

Aktuelle Chunk-Nummer, beginnend mit 1.

Content-Type

Geben Sie "application/octet-stream" für den Inhaltstyp an, wie im obigen Beispiel.

Command-line Options

--data-binary <@/FILENAME>

Laden Sie die Daten in Bytes als Binärdaten hoch und stellen Sie sicher, dass Sie dem Dateinamen ein "@" voranstellen. Geben Sie dann den Dateinamen (und ggf. den Pfad) der hochzuladenden lokalen Videodatei an.

Retry-Handling

Wenn die Antwort auf eine Chunk-Upload-Anforderung nicht 201 CREATED lautet, muss der Chunk erneut versucht werden. Dies kann aus verschiedenen Gründen geschehen, wie zum Beispiel:

  • Fehler in der Internetverbindung

  • Abgelaufenes Upload-Token

  • Ratenbegrenzung

  • Zeitüberschreitung beim Empfang einer Antwort von der API

Um zu vermeiden, dass diese Situationen Ihren Upload unterbrechen, sollten Sie in Ihrem Code Retry-Handling implementieren. Dies bedeutet, dass Sie:

  1. Identifizieren Sie die Bedingungen, die zum Scheitern eines Chunks führen würden. Zum Beispiel könnten Sie es erneut versuchen, wenn der Antwortcode nicht 201 CREATED lautet.

  2. Implementieren Sie eine Backoff-Strategie. Das bedeutet, dass Sie zwischen den einzelnen Wiederholungsversuchen eine inkrementell längere oder zufällige Zeitspanne abwarten sollten. Dadurch wird verhindert, dass Sie die API mit zu vielen Anfragen überlasten.

  3. Legen Sie eine Obergrenze für die Anzahl der Wiederholungsversuche fest. So können Sie verhindern, dass Sie in einer Endlosschleife stecken bleiben, wenn der Chunk nicht hochgeladen werden kann.

Hier sind einige Beispiele für Backoff-Strategien:

  • Fester Backoff: Warten Sie eine feste Zeitspanne zwischen den einzelnen Wiederholungsversuchen ab, z. B. 1 Sekunde.

  • Exponentieller Backoff: Es wird eine exponentiell längere Zeitspanne zwischen den einzelnen Wiederholungsversuchen abgewartet, z. B. 1, 2, 4, 8, 16, ... Sekunden.

  • Randomisiertes Backoff: Warten auf eine zufällige Zeitspanne zwischen jedem Wiederholungsversuch, z. B. zwischen 1 und 5 Sekunden.

Die beste Backoff-Strategie für Ihre spezifischen Anforderungen hängt von der Häufigkeit der Fehler und der Zeit ab, die Sie bereit sind, auf den Abschluss des Uploads zu warten.

Java 11 Chunk Upload Beispiel

Java 11 Chunk Upload Example

package mi.uploader;
 
import java.io.*;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
 
public class App {
 
    public static Integer CHUNK_SIZE = 2_097_152;
    public static Integer MAX_RETRIES = 10;
 
    public static HttpClient client = HttpClient.newBuilder()
            .version(HttpClient.Version.HTTP_1_1)
            .followRedirects(HttpClient.Redirect.NORMAL)
            .connectTimeout(Duration.ofSeconds(20))
            .build();
 
    public static void main(String[] args) throws IOException, InterruptedException {
 
        /*
         Step 1. https://doc.movingimage.com/display/LT/Creating+a+Video+Entity
         Step 2. https://doc.movingimage.com/display/LT/Getting+the+Upload+URL
         Step 3. Upload
         */
 
        URI url = URI.create("{URL obtained via API}");
        File f = new File("sample_600s_25fps_1080.mp4");
        InputStream inputStream = new FileInputStream(f);
 
        long totalChunks = calculateChunks(f.length());
 
 
        for (int i = 1; i <= totalChunks; i++) {
 
            byte[] data = new byte[CHUNK_SIZE];
 
            inputStream.read(data);
 
            int statusCode = 0;
            int retryAttempts = 0;
            do {
                if (statusCode >= 500) {
                    Thread.sleep(2000);
                }
 
                if (retryAttempts++ >= MAX_RETRIES) {
                    throw new RuntimeException("Upload failed. Please try again later.");
                }
 
                HttpRequest request = HttpRequest.newBuilder()
                        .POST(HttpRequest.BodyPublishers.ofByteArray(data))
                        .uri(url)
                        .setHeader("Mi24-Upload-Total-Chunks", String.valueOf(totalChunks)) // add request header
                        .setHeader("Mi24-Upload-Current-Chunk", String.valueOf(i)) // add request header
                        .build();
 
                HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
 
                statusCode = response.statusCode();
 
                System.out.println("Status: "+statusCode);
 
            } while (statusCode >= 500);
 
        }
 
        System.out.println("Done");
 
    }
 
    public static long calculateChunks(long fileSize) {
 
        long remainder = fileSize % CHUNK_SIZE;
        int totalChunks = Math.toIntExact(fileSize / CHUNK_SIZE);
 
        if (remainder > 0) {
            totalChunks = totalChunks + 1;
        }
 
        return totalChunks;
    }
}


War dieser Artikel hilfreich?