تدفق الوسائط

تمثل Oracle Cloud Infrastructure (OCI) Media Flow خدمة تمكن المطورين من معالجة وسائط الفيديو والصوت بتنسيقات مُختلفة للتدفق عند الطلب وتشغيل عمليات الدُفعات من خلال واجهات برمجة التطبيقات وأدوات واجهة سطر الأوامر (CLI). باستخدام تدفق وسائط OCI، يمكنك أيضًا إثراء بيانات التعريف لجعل محتوى الفيديو أكثر قابلية للبحث في نظام إدارة المحتوى (CMS) واستخدام أدوات الذكاء الاصطناعي لإظهار محتوى الفيديو وإضافة الإمكانات، مثل دعم الشرح المغلق للغات متعددة.

Oracle Cloud Infrastructure Media Flow: نظرة عامة (2:02)

طريقة عمل تدفق وسائط OCI

طريقة عمل مخطط تدفق وسائط OCI
يتم إنشاء فيديو وتحميله إلى Oracle Cloud Infrastructure Object Storage. من خلال Oracle Cloud Infrastructure Media Flow، يتم إنشاء صورة مصغرة من الفيديو من فترات زمنية قابلة للتكوين ويمكن تخزينها في تخزين كائنات OCI. ينشئ تدفق وسائط OCI أيضًا مُتغيرات متعددة للفيديو للتدفق، وتتم إضافة ملفات بيان الفيديو لتدفق HLS إلى مستودع ملفات العميل. ينشئ OCI Media Flow ملف JSON ببيانات تعريف الذكاء الاصطناعي التي تحتوي على فهرس محتوى قابل للبحث. ينشئ تدفق وسائط OCI ملف MP4 المجزأ المتعدد وقائمة التشغيل الرئيسة التي تعد متطلبات أساسية للتدفق. تستوعب تدفقات وسائط OCI قائمة تشغيل رئيسة صالحة لـ HLS وتنشئ حزم فيديو لتدفق الفيديو.

طريقة إعداد المطورين ملفات الفيديو وتحويلها

راجع طريقة تكوين تدفق وسائط وتشغيل وظائف تدفق وسائط OCI. يتطلب هذا أحدث java SDK من OCI وأخذ مدخلات اسم البادئة لملفات المخرجات. هذا مخصص للعرض فحسب ليس للاستخدام في الإنتاج.



/***********
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

تخزين مقاطع الفيديو وإدارتها

يوفر تدفق وسائط OCI بيانات تعريف لمعالجة مقاطع الفيديو وتخزينها في CMS، وتحويل ترميز الفيديو للتقديم، وتكوين إصدارات متعددة من الفيديو لتشغيل قرارات فيديو مُختلفة، وإنشاء قائمة تشغيل رئيسة للإعداد للتدفق.

مقاطع الفيديو

مقاطع الفيديو بسهولة أكبر. بعد تحديد القرارات والتكوينات المطلوبة، يمكن لتدفق وسائط OCI تقديم تنسيق الفيديو الصحيح تلقائيًا لمواقع الوسائط الاجتماعية الشائعة مثل Facebook وTwitter لسهولة المشاركة مع مختلف الجماهير.

إنشاء منصة تعلم

يمكنك بسهولة إنشاء مقاطع الفيديو ومعالجتها وتخزينها لتجربة منصة تعليمية باستخدام تدفق وسائط OCI، وضمان تجربة عملاء عالية الجودة.

أرشفة مقاطع الفيديو

يبسط تدفق وسائط OCI معالجة مقاطع الفيديو المؤرشفة وإدارتها وتنفيذها لتحسين إمكانية البحث. يمكن لتخزين كائنات OCI تخزين مقاطع الفيديو على نطاق واسع وبتكلفة منخفضة.

20 يوليو 2022

Oracle تطلق OCI Digital Media Services لتسريع عمليات الفيديو في OCI

ريمي فوررو، مدير المنتجات الرئيس لدى Oracle

نحن متحمسون للإعلان عن التوافر العام لخدمات الوسائط الرقمية (DMS) في Oracle Cloud Infrastructure (OCI). يمكن لعملاء OCI أصحاب محتوى الفيديو الاستفادة من إمكانات معالجة الوسائط منخفضة التكلفة باستخدام تدفق وسائط DMS وتوزيع الوسائط باستخدام خدمات تدفقات وسائط DMS. يمكن أن تحسن هذه الخدمات التطبيقات وعمليات الأعمال من خلال إمكانات وسائط جديدة تنشئ تجارب عملاء أفضل وتُحسن عمليات الأعمال.

اقرأ المنشور الكامل

أبرز المدونات

عرض الكل

بدء استخدام تدفق وسائط OCI

جرّب خدمات السحابة "المجانية دائمًا" واحصل على تجربة مجانية لمدة 30 يومًا

توفر Oracle مستوى مجانيًا دون أي حدود زمنية لاختيار خدمات مثل تدفقات الوسائط، وتدفقات الوسائط، وخدمات الذكاء الاصطناعي، إضافة إلى 300 دولار أمريكي كأرصدة مجانية لتجربة خدمات سحابية إضافية. بادر بالحصول على التفاصيل والاشتراك للحصول على حسابك المجاني اليوم.

  • ما الخدمات التي تتضمنها Oracle Cloud Free Tier؟

    • مجانية دائمًا
    • 2 قاعدة بيانات ذاتية، سعة 20 جيجابايت لكل واحدة
    • أجهزة الحوسبة الافتراضية
    • حجم كتل البيانات، سعة 100 جيجابايت
    • تخزين الكائنات، سعة 10 جيجابايت

الاتصال بالمبيعات

هل أنت مهتم بمعرفة المزيد عن تدفق الوسائط؟ دع أحد خبرائنا يساعدك.

  • ويمكنهم الإجابة على أسئلة مثل:

    • ما الخدمات التي تتكامل بسلاسة مع تدفق وسائط OCI؟
    • ما هو شكل التسعير لسيناريوهاتي؟
    • كيف تكون تنسيقات الفيديو المُختلفة التي يدعمها تدفق الوسائط؟