अलग-अलग फ़ॉर्मैट के बीच ट्रांसकोड करें
यह तय किया जा सकता है कि जब आपका कॉन्टेंट कैसा परफ़ॉर्म करे, तब किस तरह के ऑडियो और वीडियो फ़ॉर्मैट ट्रांसफ़ॉर्मर बना रही हूँ. उदाहरण के लिए, नीचे दिया गया कोड दिखाता है कि H.264/AVC वीडियो और AAC ऑडियो आउटपुट में ट्रांसफ़ॉर्मर कॉन्फ़िगर करने के लिए:
Transformer.Builder(context)
.setVideoMimeType(MimeTypes.VIDEO_H264)
.setAudioMimeType(MimeTypes.AUDIO_AAC)
.build()
new Transformer.Builder(context)
.setVideoMimeType(MimeTypes.VIDEO_H264)
.setAudioMimeType(MimeTypes.AUDIO_AAC)
.build();
अगर इनपुट मीडिया फ़ॉर्मैट पहले से ही ऑडियो के कॉन्फ़िगरेशन से मेल खाता है या वीडियो के लिए, ट्रांसफ़ॉर्मर अपने-आप ट्रांसमक्सिंग पर स्विच हो जाता है, यानी कि कॉपी करना इनपुट कंटेनर से आउटपुट कंटेनर में बिना कंप्रेस किए गए सैंपल बदलाव. इससे कंप्यूटेशनल लागत और क्वालिटी में होने वाले नुकसान से बचा जा सकता है उसी फ़ॉर्मैट में डीकोडिंग और री-एन्कोडिंग करते हैं.
ऑडियो या वीडियो हटाएं
EditedMediaItem.Builder
का इस्तेमाल करके ऑडियो या वीडियो हटाएं. उदाहरण के लिए:
EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build()
new EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build();
किसी क्लिप में काट-छांट करना
शुरू और खत्म होने के तय टाइमस्टैंप के बाहर का कोई भी मीडिया हटाया जा सकता है. इसके लिए, इनपुट मीडिया आइटम का क्लिपिंग कॉन्फ़िगरेशन. उदाहरण के लिए, ऐसी क्लिप जिसमें 10 सेकंड से 20 सेकंड के बीच का मीडिया ही है:
val inputMediaItem = MediaItem.Builder()
.setUri(uri)
.setClippingConfiguration(
ClippingConfiguration.Builder()
.setStartPositionMs(10_000)
.setEndPositionMs(20_000)
.build())
.build()
MediaItem inputMediaItem =
new MediaItem.Builder()
.setUri(uri)
.setClippingConfiguration(
new MediaItem.ClippingConfiguration.Builder()
.setStartPositionMs(10_000)
.setEndPositionMs(20_000)
.build())
.build();
काट-छांट को ऑप्टिमाइज़ करना
वीडियो के शुरुआती हिस्से में काट-छांट करने की सुविधा को चालू करने के लिए, उसमें काट-छांट करने की सुविधा चालू करें ऑप्टिमाइज़ेशन.
Transformer.Builder(context)
.experimentalSetTrimOptimizationEnabled(true)
.build()
new Transformer.Builder(context)
.experimentalSetTrimOptimizationEnabled(true)
.build();
इससे वीडियो के काफ़ी कम हिस्से को डिकोड करके और फिर से एन्कोड किया जाता है. इससे वीडियो का एक्सपोर्ट तेज़ी से होता है
फिर री-एन्कोडेड डेटा को मूल डेटा के साथ जोड़ दिया जाता है.
वीडियो. ऑप्टिमाइज़ेशन इस बात पर निर्भर करता है कि इनपुट फ़ाइल का कोई हिस्सा कैसे जोड़ा जा सकता है
जिसका मतलब है कि एन्कोडर का आउटपुट फ़ॉर्मैट और
इनपुट प्रारूप संगत होना चाहिए. इसलिए, उदाहरण के लिए, अगर फ़ाइल मूल रूप से
किसी दूसरे एन्कोडर लागू करने वाले डिवाइस पर बनाई गई है, तो यह
कि ऑप्टिमाइज़ेशन को लागू नहीं किया जा सकता.
ऑप्टिमाइज़ेशन के लिए, एन्कोडर को
EncoderFactory
में इनपुट फ़ॉर्मैट के साथ काम करने वाला लेवल और प्रोफ़ाइल होनी चाहिए.
यह ऑप्टिमाइज़ेशन सिर्फ़ एक ऐसेट वाले MP4 इनपुट के साथ काम करता है. इसके अलावा, इसमें कोई इफ़ेक्ट नहीं होता
कोई ऑप वीडियो इफ़ेक्ट और रोटेशन 90 डिग्री से विभाजित नहीं किया जा सकता. अगर ऑप्टिमाइज़ेशन
विफल हो जाता है, तो ट्रांसफ़ॉर्मर अपने आप सामान्य निर्यात पर चला जाता है और
ExportResult.OptimizationResult
में ऑप्टिमाइज़ेशन का नतीजा.
हम इस सुविधा की पुष्टि कर रहे हैं. हमें उम्मीद है कि यह प्रयोग के तौर पर उपलब्ध नहीं होगी रिलीज़ हो सकती है.
वीडियो में बदलाव
EditedMediaItems
में लागू करने के लिए, ऑडियो प्रोसेसर और वीडियो इफ़ेक्ट की सूची मौजूद है
ऑर्डर. इस लाइब्रेरी में, इस्तेमाल के सामान्य उदाहरणों के लिए, वीडियो इफ़ेक्ट को लागू करने की जानकारी दी गई है,
इसके अलावा, बदलाव वाला मीडिया बनाते समय कस्टम इफ़ेक्ट लिखे जा सकते हैं और उन्हें पास किया जा सकता है
आइटम.
मीडिया को फिर से स्केल किया जा सकता है. इससे प्रोसेसिंग रिसॉर्स की बचत करने या बहुत ज़्यादा रिज़ॉल्यूशन वाले इनपुट, जैसे कि 4k या 8k वीडियो के साथ काम करते समय बैंडविथ. उदाहरण के लिए, आनुपातिक रूप से 480 पिक्सल ऊंचाई तक स्केल करने के लिए:
EditedMediaItem.Builder(MediaItem.fromUri(uri))
.setEffects(Effects(
/* audioProcessors= */ listOf(),
/* videoEffects= */ listOf(Presentation.createForHeight(480))
)).build()
new EditedMediaItem.Builder(MediaItem.fromUri(uri))
.setEffects(new Effects(
/* audioProcessors= */ ImmutableList.of(),
/* videoEffects= */ ImmutableList.of(Presentation.createForHeight(480))))
.build();
इसके अलावा, किसी दिए गए फ़ैक्टर के हिसाब से स्केल किया जा सकता है. उदाहरण के लिए, साइज़ आधा करने के लिए:
val editedMediaItem = EditedMediaItem.Builder(MediaItem.fromUri(uri))
.setEffects(Effects(
/* audioProcessors= */ listOf(),
/* videoEffects= */ listOf(
ScaleAndRotateTransformation.Builder().setScale(.5f, .5f).build())
)).build()
new EditedMediaItem.Builder(MediaItem.fromUri(uri))
.setEffects(new Effects(
/* audioProcessors= */ ImmutableList.of(),
/* videoEffects= */ ImmutableList.of(
new ScaleAndRotateTransformation.Builder().setScale(.5f, .5f).build())))
.build();
आप रोटेशन को इसी तरह से कॉन्फ़िगर कर सकते हैं:
EditedMediaItem.Builder(MediaItem.fromUri(uri))
.setEffects(Effects(
/* audioProcessors= */ listOf(),
/* videoEffects= */ listOf(
ScaleAndRotateTransformation.Builder()
.setRotationDegrees(90f)
.build())
)).build()
new EditedMediaItem.Builder(MediaItem.fromUri(uri))
.setEffects(new Effects(
/* audioProcessors= */ ImmutableList.of(),
/* videoEffects= */ ImmutableList.of(
new ScaleAndRotateTransformation.Builder().setRotationDegrees(90f).build())))
.build();
पसंद के मुताबिक वीडियो इफ़ेक्ट
Effects
कंस्ट्रक्टर, लागू करने के लिए ऑडियो और वीडियो इफ़ेक्ट की सूची स्वीकार करता है.
इंटरनल तौर पर, Transformer का इफ़ेक्ट फ़्रेमवर्क वीडियो इफ़ेक्ट की सूची को बदलता है
GL शेडर प्रोग्राम के एक अनुक्रम में जो क्रम से लागू होते हैं. कुछ मामलों में,
इफ़ेक्ट फ़्रेमवर्क, एक शेडर प्रोग्राम के साथ कई इफ़ेक्ट लागू कर सकता है.
उदाहरण के लिए, एक शेडर प्रोग्राम एक से ज़्यादा लगातार मैट्रिक्स लागू कर सकता है
ट्रांसफ़ॉर्मेशन होता है, जिससे क्षमता और क्वालिटी बेहतर होती है.
ExoPlayer में झलक के लिए, वीडियो इफ़ेक्ट भी इस्तेमाल किए जा सकते हैं.
ExoPlayer.setVideoEffects
.
डेमो ऐप्लिकेशन में, कस्टम वीडियो इफ़ेक्ट के उदाहरण शामिल होते हैं.
ऑडियो में बदलाव
ऑडियो इफ़ेक्ट लागू करने के लिए, AudioProcessor
का क्रम लागू किया जाता है
रॉ (पीसीएम) ऑडियो के इंस्टेंस. ExoPlayer,
DefaultAudioSink.Builder
, इसकी मदद से ऑडियो में होने वाले बदलावों की झलक देखी जा सकती है.