- 23 Apr 2025
- Drucken
Ein Video ersetzen
- Aktualisiert am 23 Apr 2025
- Drucken
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.
Erstellen einer Videoquelle in einem angegebenen VideoManager
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:
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.
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.
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;
}
}