Media Flow

Oracle Cloud Infrastructure (OCI) Media Flow ist ein Service, mit dem Entwickler Video- und Audiomedien in verschiedene Formate für On-Demand-Streaming verarbeiten und Batch-Vorgänge über APIs und Befehlszeilenschnittstellen-Tools (CLI) ausführen können. Außerdem können Sie mit OCI Media Flow Metadaten anreichern, um Videoinhalte in einem Contentmanagementsystem (CMS) besser durchsuchbar zu machen. Darüber hinaus können Sie KI-Tools verwenden, um Videoinhalte anzuzeigen und Funktionen hinzuzufügen, wie z. B. die Unterstützung von Untertiteln in mehreren Sprachen.

Oracle Cloud Infrastructure Media Flow: Überblick (2:02)

Funktionsweise von OCI Media Flow

Diagramm zur Funktionsweise von OCI Media Flow
Ein Video wird erstellt und in Oracle Cloud Infrastructure Object Storage hochgeladen. Über Oracle Cloud Infrastructure Media Flow werden Miniaturbilder des Videos in konfigurierbaren Zeitintervallen erstellt und können im OCI Object Storage gespeichert werden. OCI Media Flow erstellt außerdem mehrere Varianten des Videos für das Streaming, und Videomanifestdateien für HLS-Streaming werden dem Datei-Repository des Kunden hinzugefügt. OCI Media Flow erstellt eine JSON-Datei mit KI-Metadaten, die einen durchsuchbaren Inhaltsindex enthält. OCI Media Flow erstellt die mehrfach fragmentierten MP4- und Master-Playlists, die für das Streaming erforderlich sind. OCI Media Streams nimmt eine gültige HLS-Master-Playlist auf und erstellt Videopakete für das Video-Streaming.

So können Entwickler Videodateien vorbereiten und transkodieren

Erfahren Sie, wie Sie einen Medienfluss erstellen und OCI Media Flow-Jobs ausführen. Dazu ist das neueste Java SDK von OCI und die Eingabe des Präfixnamens für die Ausgabedateien erforderlich. Dies dient nur der Demonstration und ist nicht für den Einsatz in einer Produktionsumgebung bestimmt.



/***********
This is a demo program to create media flow and run media flow jobs.
This requires the latest java SDK of OCI.
Takes input of the prefix name for the output files.
This is intended for a demonstration only and not for Production usage.
************/

/***********
1. Accept User Input of prefix for the outputs.
2. Create Media Client. 
3. Create Tasks.
4. Create Media Workflow.
5. Create Media Workflow Job.
************/


import com.oracle.bmc.auth.InstancePrincipalsAuthenticationDetailsProvider;
import com.oracle.bmc.auth.AuthenticationDetailsProvider;
import com.oracle.bmc.auth.ConfigFileAuthenticationDetailsProvider;
import com.oracle.bmc.mediaservices.MediaServicesClient;
import com.oracle.bmc.mediaservices.*;
import com.oracle.bmc.mediaservices.model.MediaWorkflowTask;
import com.oracle.bmc.mediaservices.model.CreateMediaWorkflowDetails;
import com.oracle.bmc.mediaservices.responses.CreateMediaWorkflowResponse;
import com.oracle.bmc.mediaservices.model.MediaWorkflow;
import com.oracle.bmc.mediaservices.requests.*;
import com.oracle.bmc.mediaservices.model.CreateMediaWorkflowJobDetails;
import com.oracle.bmc.mediaservices.model.CreateMediaWorkflowJobByIdDetails;
import com.oracle.bmc.mediaservices.responses.CreateMediaWorkflowJobResponse;
import com.oracle.bmc.mediaservices.model.MediaWorkflowJob;
import org.json.simple.*; 
import org.json.simple.parser.*;
import java.util.Collections;
import java.util.*;
import java.util.Scanner;

public class MediaflowDemoApp {
    // Get User Input
    public static String getUserInput(){
        MediaflowDemoApp.printString("Enter a name for the prefix of files:");
        Scanner input = new Scanner(System.in);
        String prefixInput = input.nextLine();
        input.close();
        return prefixInput;
    }
    // Json String to Json Object
    public static JSONObject createJSONObject(String jsonString){
        JSONObject  jsonObject=new JSONObject();
        JSONParser jsonParser=new  JSONParser();
        if ((jsonString != null) && !(jsonString.isEmpty())) {
            try {
                jsonObject=(JSONObject) jsonParser.parse(jsonString);
            } catch (org.json.simple.parser.ParseException e) {
                e.printStackTrace();
            }
        }
        return jsonObject;
    }
    // Print Function
    public static void printString(Object stringtoPrint){
        System.out.println(stringtoPrint);
    }
    // Create Media Service Client.
    public static MediaServicesClient connectMediaService(){
        InstancePrincipalsAuthenticationDetailsProvider provider = InstancePrincipalsAuthenticationDetailsProvider.builder().build();
        MediaServicesClient mediaClient =  new MediaServicesClient(provider);
        // User Principal
        // Read config from the profile DEFAULT in the file "~/.oci/config". You can switch to different profile.
        // AuthenticationDetailsProvider authenticationDetailsProvider = new ConfigFileAuthenticationDetailsProvider(PROFILE_DEFAULT);
        // MediaServicesClient mediaClient = MediaServicesClient.builder().build(authenticationDetailsProvider);
        MediaflowDemoApp.printString("Media Client Instantiated");
        return mediaClient;
    }
    // Close Media Service Client
    public static void closeMediaService(MediaServicesClient mc){
        mc.close();
        MediaflowDemoApp.printString("Media Client Closed");
    }

    // Create Tasks 
    // Tasks are discrete steps in the workflow.
    public static List<MediaWorkflowTask> createTasks(JSONObject arg0,JSONObject arg1,JSONObject arg2,JSONObject arg3,JSONObject arg4){
        long version = 1;
        List<MediaWorkflowTask> task = new ArrayList<MediaWorkflowTask>();
        List<String> typeGetFiles = new ArrayList<String>();
        List<String> typeTranscode = new ArrayList<String>();
        List<String> typeThumbnail = new ArrayList<String>();
        typeGetFiles.add("getFiles");
        typeTranscode.add("transcode1");
        typeThumbnail.add("thumbnail");
        task.add(MediaWorkflowTask.builder().type("getFiles").version(version).key("getFiles").prerequisites(Collections.emptyList()).parameters(arg0).build());
        task.add(MediaWorkflowTask.builder().type("transcribe").version(version).key("transcribe").prerequisites(typeGetFiles).parameters(arg4).build());
        task.add(MediaWorkflowTask.builder().type("transcode").version(version).key("transcode1").prerequisites(typeGetFiles).parameters(arg1).build());
        task.add(MediaWorkflowTask.builder().type("thumbnail").version(version).key("thumbnail").prerequisites(typeTranscode).parameters(arg2).build());
        task.add(MediaWorkflowTask.builder().type("putFiles").version(version).key("PutFiles1").prerequisites(typeThumbnail).parameters(arg3).build());
        return task;
    }
    // Create Media Workflow.
    public static MediaWorkflow createMediaWorkflow(MediaServicesClient mc, List<MediaWorkflowTask> tasks, JSONObject parameters,String compartment_id){
        CreateMediaWorkflowRequest  request = CreateMediaWorkflowRequest.builder().createMediaWorkflowDetails(CreateMediaWorkflowDetails.builder().displayName("test-java-sdk").compartmentId(compartment_id).tasks(tasks).parameters(parameters).build()).build();
        CreateMediaWorkflowResponse response = mc.createMediaWorkflow(request);
        MediaWorkflow mediaflow = response.getMediaWorkflow();
        return mediaflow;
    }
    // Create Media Workflow Job
    public static MediaWorkflowJob createWorkflowJob(MediaServicesClient mc, MediaWorkflow mediaflow, String prefixInput, JSONObject parameters, String compartment_id){
        String mediaWorkflowId = mediaflow.getId();
        CreateMediaWorkflowJobRequest request = CreateMediaWorkflowJobRequest.builder().createMediaWorkflowJobDetails(CreateMediaWorkflowJobByIdDetails.builder().displayName("test-java-sdk-job").compartmentId(compartment_id).mediaWorkflowId(mediaWorkflowId).parameters(parameters).build()).build();
        CreateMediaWorkflowJobResponse response = mc.createMediaWorkflowJob(request);
        MediaWorkflowJob mediaflowJob = response.getMediaWorkflowJob();
        return mediaflowJob;
    }

    public static void main(String[] args) {

        // **Variable Declarations** //
        String compartment_id = "ocid1.compartment.oc1..aaaaaaaabhuut4zoztxlfneotrwuauqt5wjhmj4kxaka6ajme4ipxqlcwv6a";
        String src_bucket = "test";
        String dst_bucket = "test";
        String namespace = "test";
        String src_video = "test";
        String prefix_input = "test";
        
        //* Task Parameters *//
        String getobjectParameters = "{\"taskParameters\": [{\"storageType\": \"objectStorage\",\"target\": \"getFiles/${/input/objectName}\",\"namespaceName\": \"${/input/namespaceName}\",\"bucketName\": \"${/input/bucketName}\",\"objectName\": \"${/input/objectName}\"}]}";
        String transcodeParameters = "{ \"transcodeType\": \"standardTranscode\", \"standardTranscode\": { \"input\": \"${/getFiles/taskParameters/0/target}\", \"outputPrefix\": \"${/transcode/outputPrefix}\", \"videoCodec\": \"h264\", \"audioCodec\": \"aac\", \"packaging\": { \"packageType\": \"hls\", \"segmentLength\": 6 }, \"ladder\": [ { \"size\": { \"height\": 1080, \"resizeMethod\": \"scale\" } }, { \"size\": { \"height\": 720, \"resizeMethod\": \"scale\" } }, { \"size\": { \"height\": 480, \"resizeMethod\": \"scale\" } }, { \"size\": { \"height\": 360, \"resizeMethod\": \"scale\" } } ] } }";
        String thumbnailParameters = "{ \"thumbnails\": { \"input\": \"${/getFiles/taskParameters/0/target}\", \"frameSelectors\": [ { \"namePrefix\": \"thumb\", \"format\": \"jpg\", \"sizes\": [ { \"width\": 390 }, { \"width\": 196 } ], \"clipImagePicker\": { \"percentList\": { \"pickList\": [ 10, 20, 30 ] } } } ] } }";
        String finaltaskParameters = "{ \"taskParameters\": [ { \"namespaceName\": \"${/output/namespaceName}\", \"bucketName\": \"${/output/bucketName}\", \"source\": \"${/transcode/outputPrefix}*.m3u8\", \"objectName\": \"${/output/objectNamePath}${/transcode/outputPrefix}\", \"assetCompartmentId\": \"${/output/assetCompartmentId}\", \"registerMetadata\": true }, { \"namespaceName\": \"${/output/namespaceName}\", \"bucketName\": \"${/output/bucketName}\", \"source\": \"master.m3u8\", \"objectName\": \"${/output/objectNamePath}${/transcode/outputPrefix}-master.m3u8\", \"assetCompartmentId\": \"${/output/assetCompartmentId}\", \"registerMetadata\": true }, { \"namespaceName\": \"${/output/namespaceName}\", \"bucketName\": \"${/output/bucketName}\", \"source\": \"*.fmp4\", \"objectName\": \"${/output/objectNamePath}\", \"assetCompartmentId\": \"${/output/assetCompartmentId}\", \"registerMetadata\": true }, { \"namespaceName\": \"${/output/namespaceName}\", \"bucketName\": \"${/output/bucketName}\", \"source\": \"*.${/thumbnail/thumbnails/frameSelectors/0/format}\", \"objectName\": \"${/output/objectNamePath}${/transcode/outputPrefix}-\", \"assetCompartmentId\": \"${/output/assetCompartmentId}\", \"registerMetadata\": true } ] }";
        String transcibeParmeters = "{ \"inputVideo\": \"${/getFiles/taskParameters/0/target}\", \"outputAudio\": \"${/output/objectNamePath}${/transcode/outputPrefix}.wav\", \"outputBucketName\": \"${/output/bucketName}\", \"outputNamespaceName\": \"${/output/namespaceName}\", \"outputTranscriptionPrefix\": \"${/output/objectNamePath}${/transcode/outputPrefix}\", \"transcriptionJobCompartment\": \"${/output/assetCompartmentId}\", \"waitForCompletion\" : true }";
        String mediaworkflowParameters = "{ \"input\": { \"objectName\": \"${/video/srcVideo}\", \"bucketName\": \"${/video/srcBucket}\", \"namespaceName\": \"${/video/namespace}\" }, \"output\": { \"bucketName\": \"${/video/dstBucket}\", \"namespaceName\": \"${/video/namespace}\", \"assetCompartmentId\": \"${/video/compartmentID}\", \"objectNamePath\": \"sdk_test/${/input/objectName}/\" }, \"transcode\": { \"outputPrefix\": \"${/video/outputPrefixName}\" } }";
        String mediaflowjobParameters = "{ \"video\": { \"srcBucket\": \"" + src_bucket+ "\", \"dstBucket\": \"" +dst_bucket+ "\", \"namespace\": \"" +namespace+ "\", \"compartmentID\": \""+compartment_id+"\", \"srcVideo\": \""+src_video+"\", \"outputPrefixName\" : \""+prefix_input+"\" } }";
        //* Json Objects of the task parameters *//
        JSONObject getobjectParametersJson = MediaflowDemoApp.createJSONObject(getobjectParameters);
        JSONObject transcodeParametersJson = MediaflowDemoApp.createJSONObject(transcodeParameters);
        JSONObject thumbnailParametersJson = MediaflowDemoApp.createJSONObject(thumbnailParameters);
        JSONObject finaltaskParametersJson = MediaflowDemoApp.createJSONObject(finaltaskParameters);
        JSONObject transcibeParmetersJson = MediaflowDemoApp.createJSONObject(transcibeParmeters);
        JSONObject mediaworkflowParametersJson = MediaflowDemoApp.createJSONObject(mediaworkflowParameters);
        JSONObject mediaflowjobParametersJson = MediaflowDemoApp.createJSONObject(mediaflowjobParameters);
        
        /* Debug JSON Prints
        MediaflowDemoApp.printString(getobjectParametersJson);
        MediaflowDemoApp.printString(transcodeParametersJson);
        MediaflowDemoApp.printString(thumbnailParametersJson);
        MediaflowDemoApp.printString(finaltaskParametersJson);
        MediaflowDemoApp.printString(transcibeParmetersJson);
        MediaflowDemoApp.printString(mediaworkflowParametersJson);
        MediaflowDemoApp.printString(mediaflowjobParametersJson);*/
        
        // Get User Input
        String prefixInput = MediaflowDemoApp.getUserInput();
        // Create the tasks for mediaflow
        List<MediaWorkflowTask> tasks = MediaflowDemoApp.createTasks(getobjectParametersJson,transcodeParametersJson,thumbnailParametersJson,finaltaskParametersJson,transcibeParmetersJson);
        // Connect to media services 
        MediaServicesClient mediaClient = MediaflowDemoApp.connectMediaService();
        // Create MediaWorkFlow 
        MediaWorkflow mediaflow = MediaflowDemoApp.createMediaWorkflow(mediaClient, tasks, mediaworkflowParametersJson, compartment_id);
        // Prints MediaWorkflow OCID
        MediaflowDemoApp.printString(mediaflow.getId());
        // Create the Workflow Job
        MediaWorkflowJob mediaflowJob = MediaflowDemoApp.createWorkflowJob(mediaClient, mediaflow, prefixInput, mediaflowjobParametersJson, compartment_id);
        // Print Workflow Job ID
        MediaflowDemoApp.printString(mediaflowJob.getId());
        // Finally Close the Media Client
        MediaflowDemoApp.closeMediaService(mediaClient);
    }
}
	

OCI Media Flow – Anwendungsfälle

Speichern und Verwalten von Videos

OCI Media Flow stellt Metadaten zur Verarbeitung von Videos und deren Speicherung in einem CMS bereit, transkodiert das Video für die Bereitstellung, erstellt mehrere Versionen des Videos zur Wiedergabe verschiedener Videoauflösungen und erstellt eine Master-Playlist zur Vorbereitung für das Streaming.

Video-Clips

Problemloses Erstellen von Video-Clips Nach Auswahl der gewünschten Auflösungen und Konfigurationen kann OCI Media Flow automatisch das richtige Videoformat für beliebte Social Media-Websites wie Facebook und Twitter liefern, um es einfach mit verschiedenen Zielgruppen zu teilen.

Erstellen einer Lernplattform

Erstellen, verarbeiten und speichern Sie mit OCI Media Flow problemlos Videos für eine Lernplattform und garantieren Sie ein qualitativ hochwertiges Kundenerlebnis.

Videos archivieren

OCI Media Flow vereinfacht für eine bessere Durchsuchbarkeit die Verarbeitung, Verwaltung und Durchführung der Inhaltserkennung für archivierte Videos. OCI Object Storage kann Videos in großem Maßstab und zu geringen Kosten speichern.

20. Juli 2022

Oracle führt OCI Digital Media Services ein, um den Videobetrieb in OCI zu beschleunigen

Remi Fourreau, Principal Product Manager, Oracle

Wir freuen uns, die allgemeine Verfügbarkeit von Digital Media Services (DMS) in Oracle Cloud Infrastructure (OCI) bekannt zu geben. OCI-Kunden mit Videoinhalten können die kostengünstigen Medienverarbeitungsfunktionen mit DMS Media Flow und die Medienverteilung mit DMS Media Streams-Services nutzen. Diese Services können Anwendungen und Geschäftsprozesse mit neuen Funktionen erweitern, die bessere Kundenerfahrungen schaffen und Geschäftsabläufe optimieren.

Vollständigen Beitrag lesen

Ausgewählte Blogs

Alle anzeigen

Erste Schritte mit OCI Media Flow

Probieren Sie Always Free-Cloud-Services aus und erhalten Sie eine 30-Tage-Testversion

Oracle bietet ein kostenloses Kontingent ohne zeitliche Begrenzung für die Auswahl von Services wie Media Flow, Media Streams und AI Services sowie 300 US-Dollar an Gratisguthaben zum Testen zusätzlicher Cloud-Services. Informieren Sie sich über die Einzelheiten und melden Sie sich noch heute für Ihr kostenloses Konto an.

  • Was ist im kostenlosen Oracle Cloud-Kontingent enthalten?

    • Immer kostenlos
    • 2 x Autonomous Database mit jeweils 20 GB
    • Compute VMs
    • 100 GB Block-Volume
    • 10 GB Objektspeicher

Vertrieb kontaktieren

Möchten Sie mehr über Media Flow erfahren? Einer unserer Experten wird Ihnen gerne helfen.

  • Sie können Fragen beantworten wie:

    • Welche Services lassen sich nahtlos in OCI Media Flow integrieren?
    • Wie sieht die Preisgestaltung für meine Szenarien aus?
    • Welche unterschiedlichen Videoformate unterstützt Media Flow?