From 716323d8dbebd3d3377bd5f2e62d248a60c1aa26 Mon Sep 17 00:00:00 2001 From: Goncalo Mendes Date: Tue, 25 Jun 2024 18:29:31 +0200 Subject: [PATCH] Decoupled transformers and NS --- Media-Transformers-Java/CHANGELOG.md | 30 ++- Media-Transformers-Java/app/build.gradle | 5 - .../app/src/main/AndroidManifest.xml | 3 +- .../videotransformers/OpenTokConfig.java | 6 +- .../videotransformers/ServerConfig.java | 2 +- Media-Transformers-Java/build.gradle | 4 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../.gitignore | 0 Media-Transformers-Kotlin/CHANGELOG.md | 37 +++ Media-Transformers-Kotlin/README.md | 219 ++++++++++++++++++ .../app/.gitignore | 0 .../app/build.gradle | 3 +- .../app/src/main/AndroidManifest.xml | 0 .../sample/basicvideochat/MainActivity.kt | 12 +- .../sample/basicvideochat/OpenTokConfig.kt | 6 +- .../sample/basicvideochat/ServerConfig.kt | 2 +- .../basicvideochat/network/APIService.kt | 0 .../basicvideochat/network/EmptyCallback.kt | 0 .../network/GetSessionResponse.kt | 0 .../app/src/main/res/drawable/vonage_logo.png | Bin .../app/src/main/res/layout/activity_main.xml | 0 .../app/src/main/res/menu/menu_chat.xml | 0 .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin .../app/src/main/res/values/strings.xml | 0 .../app/src/main/res/values/styles.xml | 0 Media-Transformers-Kotlin/build.gradle | 10 + .../gradle.properties | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 Video-Transformers-Kotlin/README.md | 86 ------- Video-Transformers-Kotlin/build.gradle | 10 - 38 files changed, 313 insertions(+), 126 deletions(-) rename {Video-Transformers-Kotlin => Media-Transformers-Kotlin}/.gitignore (100%) create mode 100644 Media-Transformers-Kotlin/CHANGELOG.md create mode 100644 Media-Transformers-Kotlin/README.md rename {Video-Transformers-Kotlin => Media-Transformers-Kotlin}/app/.gitignore (100%) rename {Video-Transformers-Kotlin => Media-Transformers-Kotlin}/app/build.gradle (90%) rename {Video-Transformers-Kotlin => Media-Transformers-Kotlin}/app/src/main/AndroidManifest.xml (100%) rename {Video-Transformers-Kotlin => Media-Transformers-Kotlin}/app/src/main/java/com/tokbox/sample/basicvideochat/MainActivity.kt (96%) rename {Video-Transformers-Kotlin => Media-Transformers-Kotlin}/app/src/main/java/com/tokbox/sample/basicvideochat/OpenTokConfig.kt (70%) rename {Video-Transformers-Kotlin => Media-Transformers-Kotlin}/app/src/main/java/com/tokbox/sample/basicvideochat/ServerConfig.kt (94%) rename {Video-Transformers-Kotlin => Media-Transformers-Kotlin}/app/src/main/java/com/tokbox/sample/basicvideochat/network/APIService.kt (100%) rename {Video-Transformers-Kotlin => Media-Transformers-Kotlin}/app/src/main/java/com/tokbox/sample/basicvideochat/network/EmptyCallback.kt (100%) rename {Video-Transformers-Kotlin => Media-Transformers-Kotlin}/app/src/main/java/com/tokbox/sample/basicvideochat/network/GetSessionResponse.kt (100%) rename {Video-Transformers-Kotlin => Media-Transformers-Kotlin}/app/src/main/res/drawable/vonage_logo.png (100%) rename {Video-Transformers-Kotlin => Media-Transformers-Kotlin}/app/src/main/res/layout/activity_main.xml (100%) rename {Video-Transformers-Kotlin => Media-Transformers-Kotlin}/app/src/main/res/menu/menu_chat.xml (100%) rename {Video-Transformers-Kotlin => Media-Transformers-Kotlin}/app/src/main/res/mipmap-hdpi/ic_launcher.png (100%) rename {Video-Transformers-Kotlin => Media-Transformers-Kotlin}/app/src/main/res/mipmap-mdpi/ic_launcher.png (100%) rename {Video-Transformers-Kotlin => Media-Transformers-Kotlin}/app/src/main/res/mipmap-xhdpi/ic_launcher.png (100%) rename {Video-Transformers-Kotlin => Media-Transformers-Kotlin}/app/src/main/res/mipmap-xxhdpi/ic_launcher.png (100%) rename {Video-Transformers-Kotlin => Media-Transformers-Kotlin}/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png (100%) rename {Video-Transformers-Kotlin => Media-Transformers-Kotlin}/app/src/main/res/values/strings.xml (100%) rename {Video-Transformers-Kotlin => Media-Transformers-Kotlin}/app/src/main/res/values/styles.xml (100%) create mode 100644 Media-Transformers-Kotlin/build.gradle rename {Video-Transformers-Kotlin => Media-Transformers-Kotlin}/gradle.properties (100%) rename {Video-Transformers-Kotlin => Media-Transformers-Kotlin}/gradle/wrapper/gradle-wrapper.jar (100%) rename {Video-Transformers-Kotlin => Media-Transformers-Kotlin}/gradle/wrapper/gradle-wrapper.properties (93%) rename {Video-Transformers-Kotlin => Media-Transformers-Kotlin}/gradlew (100%) rename {Video-Transformers-Kotlin => Media-Transformers-Kotlin}/gradlew.bat (100%) rename {Video-Transformers-Kotlin => Media-Transformers-Kotlin}/settings.gradle (100%) delete mode 100644 Video-Transformers-Kotlin/README.md delete mode 100644 Video-Transformers-Kotlin/build.gradle diff --git a/Media-Transformers-Java/CHANGELOG.md b/Media-Transformers-Java/CHANGELOG.md index 01ba8528..eadd66a5 100644 --- a/Media-Transformers-Java/CHANGELOG.md +++ b/Media-Transformers-Java/CHANGELOG.md @@ -2,24 +2,36 @@ All notable changes to this project will be documented in this file. -## 2.25.2 +## 2.27.2 ### Added -- Support pre-built transformers in the Vonage Media Processor library or create your own custom video transformer to apply to published video. +- Support Vonage Media Processor library as a opt-in library. +- Supports Noise Suppression ### Fixed -- NA +- Decoupled Media Processor library + +### Notes + +For versions with Android Gradle Plugin prior to 7.4, on merging native builds, it raises a error due to "2 files found with path 'lib/arm64-v8a/libmltransformers.so' from inputs". + +The issue can be solved by adding to Media-Transformers-Java build.gradle the following option. -### Enhancements +```c +packagingOptions { + pickFirst "**/libmltransformers.so" + pickFirst "**/libmltransformersaudionoisesuppression.so" + } +``` -- NA -### Changed -- NA +## 2.25.2 + +### Added + +- Support pre-built transformers in the Vonage Media Processor library or create your own custom video transformer to apply to published video. -### Deprecated -- NA diff --git a/Media-Transformers-Java/app/build.gradle b/Media-Transformers-Java/app/build.gradle index 2c75982b..884c4838 100644 --- a/Media-Transformers-Java/app/build.gradle +++ b/Media-Transformers-Java/app/build.gradle @@ -28,11 +28,6 @@ android { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } - - packagingOptions { - pickFirst "**/libmltransformers.so" - pickFirst "**/libmltransformersaudionoisesuppression.so" - } } dependencies { diff --git a/Media-Transformers-Java/app/src/main/AndroidManifest.xml b/Media-Transformers-Java/app/src/main/AndroidManifest.xml index 72b83861..6b90ce3f 100644 --- a/Media-Transformers-Java/app/src/main/AndroidManifest.xml +++ b/Media-Transformers-Java/app/src/main/AndroidManifest.xml @@ -1,6 +1,5 @@ - + diff --git a/Media-Transformers-Java/app/src/main/java/com/tokbox/sample/videotransformers/OpenTokConfig.java b/Media-Transformers-Java/app/src/main/java/com/tokbox/sample/videotransformers/OpenTokConfig.java index 672392b9..e01b491c 100644 --- a/Media-Transformers-Java/app/src/main/java/com/tokbox/sample/videotransformers/OpenTokConfig.java +++ b/Media-Transformers-Java/app/src/main/java/com/tokbox/sample/videotransformers/OpenTokConfig.java @@ -14,13 +14,13 @@ public class OpenTokConfig { */ // Replace with a API key - public static final String API_KEY = "47521351"; + public static final String API_KEY = ""; // Replace with a generated Session ID - public static final String SESSION_ID = "1_MX40NzUyMTM1MX5-MTcxODM1OTEyMzUyNH5oaUhWbUx4TXJQdldMY2tmRGJ1bFB3a2Z-fn4"; + public static final String SESSION_ID = ""; // Replace with a generated token (from the dashboard or using an OpenTok server SDK) - public static final String TOKEN = "T1==cGFydG5lcl9pZD00NzUyMTM1MSZzaWc9OWU0YTYyZWVlMDk1YjY4YmFlNjhmZDRjZjkyYjU3ODU4MjcxZjQyNzpzZXNzaW9uX2lkPTFfTVg0ME56VXlNVE0xTVg1LU1UY3hPRE0xT1RFeU16VXlOSDVvYVVoV2JVeDRUWEpRZGxkTVkydG1SR0oxYkZCM2EyWi1mbjQmY3JlYXRlX3RpbWU9MTcxODM1OTEyOCZub25jZT0wLjAxMTc0MTEzNTQ5NDAxOTExNyZyb2xlPXB1Ymxpc2hlciZleHBpcmVfdGltZT0xNzIwOTUxMTI3JmluaXRpYWxfbGF5b3V0X2NsYXNzX2xpc3Q9"; + public static final String TOKEN = ""; // *** The code below is to validate this configuration file. You do not need to modify it *** diff --git a/Media-Transformers-Java/app/src/main/java/com/tokbox/sample/videotransformers/ServerConfig.java b/Media-Transformers-Java/app/src/main/java/com/tokbox/sample/videotransformers/ServerConfig.java index 21ab6acd..e06f9b1f 100644 --- a/Media-Transformers-Java/app/src/main/java/com/tokbox/sample/videotransformers/ServerConfig.java +++ b/Media-Transformers-Java/app/src/main/java/com/tokbox/sample/videotransformers/ServerConfig.java @@ -17,7 +17,7 @@ public class ServerConfig { Note that this application will ignore credentials in the `OpenTokConfig` file when `CHAT_SERVER_URL` contains a valid URL. */ - public static final String CHAT_SERVER_URL = ""; + public static final String CHAT_SERVER_URL = "https://YOURAPPNAME.herokuapp.com"; // *** The code below is to validate this configuration file. You do not need to modify it *** diff --git a/Media-Transformers-Java/build.gradle b/Media-Transformers-Java/build.gradle index 2fcc7ef7..ddefa151 100644 --- a/Media-Transformers-Java/build.gradle +++ b/Media-Transformers-Java/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id 'com.android.application' version '7.1.2' apply false - id 'com.android.library' version '7.1.2' apply false + id 'com.android.application' version '7.4.0' apply false + id 'com.android.library' version '7.4.0' apply false } task clean(type: Delete) { diff --git a/Media-Transformers-Java/gradle/wrapper/gradle-wrapper.properties b/Media-Transformers-Java/gradle/wrapper/gradle-wrapper.properties index cc7d7ecf..917cb13c 100644 --- a/Media-Transformers-Java/gradle/wrapper/gradle-wrapper.properties +++ b/Media-Transformers-Java/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip diff --git a/Video-Transformers-Kotlin/.gitignore b/Media-Transformers-Kotlin/.gitignore similarity index 100% rename from Video-Transformers-Kotlin/.gitignore rename to Media-Transformers-Kotlin/.gitignore diff --git a/Media-Transformers-Kotlin/CHANGELOG.md b/Media-Transformers-Kotlin/CHANGELOG.md new file mode 100644 index 00000000..eadd66a5 --- /dev/null +++ b/Media-Transformers-Kotlin/CHANGELOG.md @@ -0,0 +1,37 @@ +# Video Transformers Changelog + +All notable changes to this project will be documented in this file. + +## 2.27.2 + +### Added + +- Support Vonage Media Processor library as a opt-in library. +- Supports Noise Suppression + +### Fixed + +- Decoupled Media Processor library + +### Notes + +For versions with Android Gradle Plugin prior to 7.4, on merging native builds, it raises a error due to "2 files found with path 'lib/arm64-v8a/libmltransformers.so' from inputs". + +The issue can be solved by adding to Media-Transformers-Java build.gradle the following option. + +```c +packagingOptions { + pickFirst "**/libmltransformers.so" + pickFirst "**/libmltransformersaudionoisesuppression.so" + } +``` + + + +## 2.25.2 + +### Added + +- Support pre-built transformers in the Vonage Media Processor library or create your own custom video transformer to apply to published video. + + diff --git a/Media-Transformers-Kotlin/README.md b/Media-Transformers-Kotlin/README.md new file mode 100644 index 00000000..ac0d6ab4 --- /dev/null +++ b/Media-Transformers-Kotlin/README.md @@ -0,0 +1,219 @@ +Video Transformers +====================== + +The Video Transformers app is a very simple application created on top of Basic Video Chat meant to get a new developer +started using Media Processor APIs on OpenTok Android SDK. For a full description, see the [Video Transformers tutorial at the +OpenTok developer center](https://tokbox.com/developer/guides/vonage-media-processor/android). + +

+You can use pre-built transformers in the Vonage Media Processor library or create your own custom audio +or video transformer to apply to published video. +

+ +You can use the PublisherKit.setAudioTransformers() and +PublisherKit.setVideoTransformers() +methods to apply audio and video transformers to a stream. + +
+ Important: +

+ Media transformations are not supported on all devices. See Client requirements. +

+
+ +The Vonage Video Android SDK includes two ways to implement transformers: + +* **Moderate** — For video, you can apply the background blur and background replacement video transformers included in the [Vonage Media Library](#vonage-media-library-integration). See [Applying a video transformer from the Vonage Media Library](#applying-a-video-transformer-from-the-vonage-media-library). For audio, you can apply the noise suppression audio transformer included in the [Vonage Media Library](#vonage-media-library-integration). See [Applying an audio transformer from the Vonage Media Library](#applying-an-audio-transformer-from-the-vonage-media-library). + +* **Advanced** — You can create your own [custom video transformers](#creating-a-custom-video-transformer) and [custom audio transformers](#creating-a-custom-audio-transformer). + + +## Client requirements + +The transformers from the Vonage Media Library are supported on Android API Level of 23 or above, on the following devices: + +* Samsung Galaxy S8 and above +* Google Pixel 5 and above +* OPPO A94 and above +* Android phones using Qualcomm Snapdragon 835 and above +* Android Phones using Qualcomm Snapdragon 765G and above + +Test on other devices to check for support. + +Transformers require adequate processor support. Even on supported devices, transformers may not be stable when background processes limit available processing resources. The same limitations may apply with custom media transformers in addition to transformers from the Vonage Media Library. + +Android may throttle CPU performance to conserve energy (for example, to extend battery life) by throttling CPU performance. This may result in suboptimal transformer performance and introduce unwanted audio or video artifacts. We recommend disabling battery saver or low-power mode, if it is an option, in such cases. + +Many video transformations (such as background blur) use segmentation to separate the speaker from the background. For best results, use proper lighting and a plain background. Insufficient lighting or complex backgrounds may cause video artifacts (for example, the speaker or a hat the speaker is wearing may get blurred along with the background). + +You should perform benchmark tests on as many supported devices as possible, regardless of the transformation. + +# Vonage Media Library integration + +Due to significant increased size when integrating Vonage Media Library into SDK, from OpenTok SDK v2.27.2 the Media Transformers are available via the opt-in Vonage Media Library. This library needs to explicitly be added to the project. + +The Vonage Media Library was initially embedded in OpenTok SDK. If your OpenTok SDK version is older than 2.27.2, move directly to [Applying a video transformer from the Vonage Media Library](#applying-a-video-transformer-from-the-vonage-media-library) and [Applying an audio transformer from the Vonage Media Library](#applying-an-audio-transformer-from-the-vonage-media-library). + +A Maven version is available at https://central.sonatype.com/artifact/com.vonage/client-sdk-video-transformers. +The artifact ID is `"client-sdk-video-transformers"`. + +Modify the app's build.gradle file and add the following code snippet to the +`dependencies` section: + +``` +implementation 'com.vonage:client-sdk-video-transformers:2.27.2' +``` + +If a call to PublisherKit.VideoTransformer(String name, String properties) or PublisherKit.AudioTransformer(String name, String properties) is made without loading the library, the transformer returned will be null. An exception will be raised with the following error code `0x0A000006 - OTC_MEDIA_TRANSFORMER_OPENTOK_TRANSFORMERS_LIBRARY_NOT_LOADED`. + +## Applying a video transformer from the Vonage Media Library + +Use the PublisherKit.VideoTransformer(String name, String properties) +constructor to create a video transformer that uses a named transformer from the Vonage Media Library. + +Two transformers are supported: + +* **Background blur.** For this filter, set the `name` parameter to `"BackgroundBlur"`. Set the `properties` parameter to a JSON string defining properties for the transformer. For the background blur transformer, this JSON includes one property -- `radius` -- which can be set +to `"High"`, `"Low"`, `"None"`, or `"Custom`. If you set the `radius` property to "Custom", add a `custom_radius` property to the JSON string: `"{\"radius\":\"Custom\",\"custom_radius\":\"value\"}"` (where `custom_radius` is a positive integer defining the blur radius). + + ```java + Publisher publisher = new Publisher.Builder(MainActivity.this).build(); + ArrayList videoTransformers = new ArrayList<>(); + PublisherKit.VideoTransformer backgroundBlur = publisher.new VideoTransformer( + "BackgroundBlur", + "{\"radius\":\"High\"}" + ); + videoTransformers.add(backgroundBlur); + publisher.setVideoTransformers(videoTransformers); + ``` + +* **Background replacement.** For this filter, set the `name` parameter to `"BackgroundReplacement"`. And set a `properties` parameter to a JSON string. The format of the JSON is `"{\"image_file_path\":\"path/to/image\"}"`, where `image_file_path` is the absolute file path of a local image to use as virtual background. Supported image formats are PNG and JPEG. + + ```java + Publisher publisher = new Publisher.Builder(MainActivity.this).build(); + ArrayList videoTransformers = new ArrayList<>(); + PublisherKit.VideoTransformer backgroundReplacement = publisher.new VideoTransformer( + "BackgroundReplacement", + "{\"image_file_path\":\"path-to-image-file\"}" + ); + videoTransformers.add(backgroundReplacement); + publisher.setVideoTransformers(videoTransformers); + ``` + +## Applying an audio transformer from the Vonage Media Library + +

+ Note: This is a beta feature. +

+ +Use the PublisherKit.AudioTransformer(String name, String properties) +constructor to create an audio transformer that uses a named transformer from the Vonage Media Library. + +One transformer is supported: + +* **Noise Suppression.** For this filter, set the `name` parameter to `"NoiseSuppression"`. Set the `properties` parameter to a JSON string defining properties for the transformer. For the noise suppression transformer, this JSON does not include any property at the moment. Set it to an empty JSON string `"{}"`. + + ```java + Publisher publisher = new Publisher.Builder(MainActivity.this).build(); + ArrayList audioTransformers = new ArrayList<>(); + PublisherKit.AudioTransformer noiseSuppression = publisher.new AudioTransformer( + "NoiseSuppression", + "{}" + ); + audioTransformers.add(noiseSuppression); + publisher.setAudioTransformers(audioTransformers); + ``` + +## Creating a custom video transformer + +Create a class that implements the PublisherKit.CustomVideoTransformer +interface. Implement the `PublisherKit.CustomVideoTransformer.onTransform​(BaseVideoRenderer.Frame frame)` method. The `PublisherKit.CustomVideoTransformer.onTransform​(BaseVideoRenderer.Frame frame)` method is triggered for each video frame. +In the implementation of the method, apply a transformation to the `frame` object passed into the method: + +```java +public class MyCustomTransformer implements PublisherKit.CustomVideoTransformer { + @Override + public void onTransform(BaseVideoRenderer.Frame frame) { + // Replace this with code to transform the frame: + frame.convertInPlace(frame.getYplane(), frame.getVplane(), frame.getUplane(), frame.getYstride(), frame.getUvStride()); + } +} +``` + +Then pass the object that implements the PublisherKit.CustomVideoTransformer interface into the `PublisherKit.setVideoTransformers()` method: + +```java + Publisher publisher = new Publisher.Builder(MainActivity.this).build(); + MyCustomTransformer transformer = new MyCustomTransformer(); + PublisherKit.VideoTransformer myCustomTransformer = publisher.new VideoTransformer("myTransformer", transformer); + ArrayList videoTransformers = new ArrayList<>(); + videoTransformers.add(myCustomTransformer); + publisher.setVideoTransformers(videoTransformers); +``` + +You can combine the Vonage Media library transformer (see the previous section) with custom transformers or apply +multiple custom transformers by adding multiple PublisherKit.VideoTransformer objects to the ArrayList passed +into the `PublisherKit.setVideoTransformers()` method. + +adding multiple OTPublisherKit.VideoTransformer objects to the array used +for the `OTPublisherKit.videoTransformers` property. + +## Creating a custom audio transformer + +Create a class that implements the PublisherKit.CustomAudioTransformer +interface. Implement the `PublisherKit.CustomAudioTransformer.onTransform​(AudioData audioData)` method. +The `PublisherKit.CustomAudioTransformer.onTransform​(AudioData audioData)` method is triggered for each audio frame. +In the implementation of the method, apply a transformation to the `frame` object passed into the method. +The following example applies a simple amplitude limiter on the audio: + +```java +public class MyCustomAudioTransformer implements PublisherKit.CustomAudioTransformer { + private short CROP_LIMIT = (short)(32767 * 0.05); + @Override + public void onTransform(AudioData audioData) { + int samplesPerChannel = (int)audioData.getNumberOfSamples() * (int)audioData.getNumberOfChannels(); + ShortBuffer samples = audioData.getSampleBuffer().asShortBuffer(); + for (int s = 0; s < samplesPerChannel; ++s) { + short sample = samples.get(s); + if (sample > CROP_LIMIT) + samples.put(s, CROP_LIMIT); + else if (sample < -CROP_LIMIT) + samples.put(s, (short)-CROP_LIMIT); + } + } +} +``` + +Then pass the object that implements the PublisherKit.CustomAudioTransformer interface into the `PublisherKit.setAudioTransformers()` method: + +```java + Publisher publisher = new Publisher.Builder(MainActivity.this).build(); + MyCustomAudioTransformer transformer = new MyCustomAudioTransformer(); + PublisherKit.AudioTransformer myCustomTransformer = publisher.new AudioTransformer("myTransformer", transformer); + ArrayList audioTransformers = new ArrayList<>(); + audioTransformers.add(myCustomTransformer); + publisher.setAudioTransformers(audioTransformers); +``` + +You can apply multiple custom transformers by adding multiple PublisherKit.AudioTransformer objects to the ArrayList +passed into the `PublisherKit.setAudioTransformers()` method. + +## Clearing video transformers for a publisher + +To clear video transformers for a publisher, pass an empty ArrayList into +into the `PublisherKit.setVideoTransformers()` method. + +```java +videoTransformers.clear(); +mPublisher.setVideoTransformers(videoTransformers); +``` + +## Clearing audio transformers for a publisher + +To clear audio transformers for a publisher, pass an empty ArrayList into +into the `PublisherKit.setAudioTransformers()` method. + +```java +audioTransformers.clear(); +mPublisher.setAudioTransformers(videoTransformers); +``` diff --git a/Video-Transformers-Kotlin/app/.gitignore b/Media-Transformers-Kotlin/app/.gitignore similarity index 100% rename from Video-Transformers-Kotlin/app/.gitignore rename to Media-Transformers-Kotlin/app/.gitignore diff --git a/Video-Transformers-Kotlin/app/build.gradle b/Media-Transformers-Kotlin/app/build.gradle similarity index 90% rename from Video-Transformers-Kotlin/app/build.gradle rename to Media-Transformers-Kotlin/app/build.gradle index 88e9ac0a..e4087a47 100644 --- a/Video-Transformers-Kotlin/app/build.gradle +++ b/Media-Transformers-Kotlin/app/build.gradle @@ -37,7 +37,8 @@ android { dependencies { // Dependency versions are defined in the ../../commons.gradle file - implementation "com.opentok.android:opentok-android-sdk:${extOpentokSdkVersion}" + implementation "com.vonage:client-sdk-video:${extOpentokSdkVersion}" + implementation "com.vonage:client-sdk-video-transformers:${extOpentokSdkVersion}" implementation "androidx.appcompat:appcompat:${extAppCompatVersion}" implementation "pub.devrel:easypermissions:${extEasyPermissionsVersion}" implementation "androidx.constraintlayout:constraintlayout:${extConstraintLyoutVersion}" diff --git a/Video-Transformers-Kotlin/app/src/main/AndroidManifest.xml b/Media-Transformers-Kotlin/app/src/main/AndroidManifest.xml similarity index 100% rename from Video-Transformers-Kotlin/app/src/main/AndroidManifest.xml rename to Media-Transformers-Kotlin/app/src/main/AndroidManifest.xml diff --git a/Video-Transformers-Kotlin/app/src/main/java/com/tokbox/sample/basicvideochat/MainActivity.kt b/Media-Transformers-Kotlin/app/src/main/java/com/tokbox/sample/basicvideochat/MainActivity.kt similarity index 96% rename from Video-Transformers-Kotlin/app/src/main/java/com/tokbox/sample/basicvideochat/MainActivity.kt rename to Media-Transformers-Kotlin/app/src/main/java/com/tokbox/sample/basicvideochat/MainActivity.kt index 1bbdfe89..7aebc120 100644 --- a/Video-Transformers-Kotlin/app/src/main/java/com/tokbox/sample/basicvideochat/MainActivity.kt +++ b/Media-Transformers-Kotlin/app/src/main/java/com/tokbox/sample/basicvideochat/MainActivity.kt @@ -46,8 +46,9 @@ class MainActivity : AppCompatActivity(), PermissionCallbacks { //Button to toggle Video Transformers private var buttonVideoTransformers: Button? = null - // Array of Video Transformers + // Array of Media Transformers var videoTransformers: ArrayList = ArrayList() + var audioTransformers: ArrayList = ArrayList() private val publisherListener: PublisherListener = object : PublisherListener { override fun onStreamCreated(publisherKit: PublisherKit, stream: Stream) { @@ -313,11 +314,20 @@ class MainActivity : AppCompatActivity(), PermissionCallbacks { videoTransformers.add(backgroundBlur) videoTransformers.add(myCustomTransformer) publisher!!.setVideoTransformers(videoTransformers) + + audioTransformers.clear() + val ns = publisher!!.AudioTransformer("NoiseSuppression", "") + audioTransformers.add(ns) + publisher!!.setAudioTransformers(audioTransformers) + isSet = true buttonVideoTransformers?.text = "Reset" } else { videoTransformers.clear() publisher!!.setVideoTransformers(videoTransformers) + audioTransformers.clear() + publisher!!.setAudioTransformers(audioTransformers) + isSet = false buttonVideoTransformers?.text = "Set" } diff --git a/Video-Transformers-Kotlin/app/src/main/java/com/tokbox/sample/basicvideochat/OpenTokConfig.kt b/Media-Transformers-Kotlin/app/src/main/java/com/tokbox/sample/basicvideochat/OpenTokConfig.kt similarity index 70% rename from Video-Transformers-Kotlin/app/src/main/java/com/tokbox/sample/basicvideochat/OpenTokConfig.kt rename to Media-Transformers-Kotlin/app/src/main/java/com/tokbox/sample/basicvideochat/OpenTokConfig.kt index e748bebb..e6668677 100644 --- a/Video-Transformers-Kotlin/app/src/main/java/com/tokbox/sample/basicvideochat/OpenTokConfig.kt +++ b/Media-Transformers-Kotlin/app/src/main/java/com/tokbox/sample/basicvideochat/OpenTokConfig.kt @@ -19,13 +19,13 @@ object OpenTokConfig { */ // Replace with a API key - const val API_KEY = "" + const val API_KEY = "47521351" // Replace with a generated Session ID - const val SESSION_ID = "" + const val SESSION_ID = "1_MX40NzUyMTM1MX5-MTcxODM1OTEyMzUyNH5oaUhWbUx4TXJQdldMY2tmRGJ1bFB3a2Z-fn4" // Replace with a generated token (from the dashboard or using an OpenTok server SDK) - const val TOKEN = "" + const val TOKEN = "T1==cGFydG5lcl9pZD00NzUyMTM1MSZzaWc9OWU0YTYyZWVlMDk1YjY4YmFlNjhmZDRjZjkyYjU3ODU4MjcxZjQyNzpzZXNzaW9uX2lkPTFfTVg0ME56VXlNVE0xTVg1LU1UY3hPRE0xT1RFeU16VXlOSDVvYVVoV2JVeDRUWEpRZGxkTVkydG1SR0oxYkZCM2EyWi1mbjQmY3JlYXRlX3RpbWU9MTcxODM1OTEyOCZub25jZT0wLjAxMTc0MTEzNTQ5NDAxOTExNyZyb2xlPXB1Ymxpc2hlciZleHBpcmVfdGltZT0xNzIwOTUxMTI3JmluaXRpYWxfbGF5b3V0X2NsYXNzX2xpc3Q9" // *** The code below is to validate this configuration file. You do not need to modify it *** val isValid: Boolean diff --git a/Video-Transformers-Kotlin/app/src/main/java/com/tokbox/sample/basicvideochat/ServerConfig.kt b/Media-Transformers-Kotlin/app/src/main/java/com/tokbox/sample/basicvideochat/ServerConfig.kt similarity index 94% rename from Video-Transformers-Kotlin/app/src/main/java/com/tokbox/sample/basicvideochat/ServerConfig.kt rename to Media-Transformers-Kotlin/app/src/main/java/com/tokbox/sample/basicvideochat/ServerConfig.kt index 0140ced6..5bb470cf 100644 --- a/Video-Transformers-Kotlin/app/src/main/java/com/tokbox/sample/basicvideochat/ServerConfig.kt +++ b/Media-Transformers-Kotlin/app/src/main/java/com/tokbox/sample/basicvideochat/ServerConfig.kt @@ -16,7 +16,7 @@ object ServerConfig { Note that this application will ignore credentials in the `OpenTokConfig` file when `CHAT_SERVER_URL` contains a valid URL. */ - const val CHAT_SERVER_URL: String = "" + const val CHAT_SERVER_URL: String = "https://YOURAPPNAME.herokuapp.com" // *** The code below is to validate this configuration file. You do not need to modify it *** fun hasChatServerUrl() = !TextUtils.isEmpty(CHAT_SERVER_URL) diff --git a/Video-Transformers-Kotlin/app/src/main/java/com/tokbox/sample/basicvideochat/network/APIService.kt b/Media-Transformers-Kotlin/app/src/main/java/com/tokbox/sample/basicvideochat/network/APIService.kt similarity index 100% rename from Video-Transformers-Kotlin/app/src/main/java/com/tokbox/sample/basicvideochat/network/APIService.kt rename to Media-Transformers-Kotlin/app/src/main/java/com/tokbox/sample/basicvideochat/network/APIService.kt diff --git a/Video-Transformers-Kotlin/app/src/main/java/com/tokbox/sample/basicvideochat/network/EmptyCallback.kt b/Media-Transformers-Kotlin/app/src/main/java/com/tokbox/sample/basicvideochat/network/EmptyCallback.kt similarity index 100% rename from Video-Transformers-Kotlin/app/src/main/java/com/tokbox/sample/basicvideochat/network/EmptyCallback.kt rename to Media-Transformers-Kotlin/app/src/main/java/com/tokbox/sample/basicvideochat/network/EmptyCallback.kt diff --git a/Video-Transformers-Kotlin/app/src/main/java/com/tokbox/sample/basicvideochat/network/GetSessionResponse.kt b/Media-Transformers-Kotlin/app/src/main/java/com/tokbox/sample/basicvideochat/network/GetSessionResponse.kt similarity index 100% rename from Video-Transformers-Kotlin/app/src/main/java/com/tokbox/sample/basicvideochat/network/GetSessionResponse.kt rename to Media-Transformers-Kotlin/app/src/main/java/com/tokbox/sample/basicvideochat/network/GetSessionResponse.kt diff --git a/Video-Transformers-Kotlin/app/src/main/res/drawable/vonage_logo.png b/Media-Transformers-Kotlin/app/src/main/res/drawable/vonage_logo.png similarity index 100% rename from Video-Transformers-Kotlin/app/src/main/res/drawable/vonage_logo.png rename to Media-Transformers-Kotlin/app/src/main/res/drawable/vonage_logo.png diff --git a/Video-Transformers-Kotlin/app/src/main/res/layout/activity_main.xml b/Media-Transformers-Kotlin/app/src/main/res/layout/activity_main.xml similarity index 100% rename from Video-Transformers-Kotlin/app/src/main/res/layout/activity_main.xml rename to Media-Transformers-Kotlin/app/src/main/res/layout/activity_main.xml diff --git a/Video-Transformers-Kotlin/app/src/main/res/menu/menu_chat.xml b/Media-Transformers-Kotlin/app/src/main/res/menu/menu_chat.xml similarity index 100% rename from Video-Transformers-Kotlin/app/src/main/res/menu/menu_chat.xml rename to Media-Transformers-Kotlin/app/src/main/res/menu/menu_chat.xml diff --git a/Video-Transformers-Kotlin/app/src/main/res/mipmap-hdpi/ic_launcher.png b/Media-Transformers-Kotlin/app/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from Video-Transformers-Kotlin/app/src/main/res/mipmap-hdpi/ic_launcher.png rename to Media-Transformers-Kotlin/app/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/Video-Transformers-Kotlin/app/src/main/res/mipmap-mdpi/ic_launcher.png b/Media-Transformers-Kotlin/app/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from Video-Transformers-Kotlin/app/src/main/res/mipmap-mdpi/ic_launcher.png rename to Media-Transformers-Kotlin/app/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/Video-Transformers-Kotlin/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/Media-Transformers-Kotlin/app/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from Video-Transformers-Kotlin/app/src/main/res/mipmap-xhdpi/ic_launcher.png rename to Media-Transformers-Kotlin/app/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/Video-Transformers-Kotlin/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/Media-Transformers-Kotlin/app/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from Video-Transformers-Kotlin/app/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to Media-Transformers-Kotlin/app/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/Video-Transformers-Kotlin/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/Media-Transformers-Kotlin/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from Video-Transformers-Kotlin/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png rename to Media-Transformers-Kotlin/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/Video-Transformers-Kotlin/app/src/main/res/values/strings.xml b/Media-Transformers-Kotlin/app/src/main/res/values/strings.xml similarity index 100% rename from Video-Transformers-Kotlin/app/src/main/res/values/strings.xml rename to Media-Transformers-Kotlin/app/src/main/res/values/strings.xml diff --git a/Video-Transformers-Kotlin/app/src/main/res/values/styles.xml b/Media-Transformers-Kotlin/app/src/main/res/values/styles.xml similarity index 100% rename from Video-Transformers-Kotlin/app/src/main/res/values/styles.xml rename to Media-Transformers-Kotlin/app/src/main/res/values/styles.xml diff --git a/Media-Transformers-Kotlin/build.gradle b/Media-Transformers-Kotlin/build.gradle new file mode 100644 index 00000000..215d844a --- /dev/null +++ b/Media-Transformers-Kotlin/build.gradle @@ -0,0 +1,10 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +plugins { + id 'com.android.application' version '7.4.0' apply false + id 'com.android.library' version '7.4.0' apply false + id 'org.jetbrains.kotlin.android' version '1.6.21' apply false +} + +task clean(type: Delete) { + delete rootProject.buildDir +} \ No newline at end of file diff --git a/Video-Transformers-Kotlin/gradle.properties b/Media-Transformers-Kotlin/gradle.properties similarity index 100% rename from Video-Transformers-Kotlin/gradle.properties rename to Media-Transformers-Kotlin/gradle.properties diff --git a/Video-Transformers-Kotlin/gradle/wrapper/gradle-wrapper.jar b/Media-Transformers-Kotlin/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from Video-Transformers-Kotlin/gradle/wrapper/gradle-wrapper.jar rename to Media-Transformers-Kotlin/gradle/wrapper/gradle-wrapper.jar diff --git a/Video-Transformers-Kotlin/gradle/wrapper/gradle-wrapper.properties b/Media-Transformers-Kotlin/gradle/wrapper/gradle-wrapper.properties similarity index 93% rename from Video-Transformers-Kotlin/gradle/wrapper/gradle-wrapper.properties rename to Media-Transformers-Kotlin/gradle/wrapper/gradle-wrapper.properties index cc7d7ecf..917cb13c 100644 --- a/Video-Transformers-Kotlin/gradle/wrapper/gradle-wrapper.properties +++ b/Media-Transformers-Kotlin/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip diff --git a/Video-Transformers-Kotlin/gradlew b/Media-Transformers-Kotlin/gradlew similarity index 100% rename from Video-Transformers-Kotlin/gradlew rename to Media-Transformers-Kotlin/gradlew diff --git a/Video-Transformers-Kotlin/gradlew.bat b/Media-Transformers-Kotlin/gradlew.bat similarity index 100% rename from Video-Transformers-Kotlin/gradlew.bat rename to Media-Transformers-Kotlin/gradlew.bat diff --git a/Video-Transformers-Kotlin/settings.gradle b/Media-Transformers-Kotlin/settings.gradle similarity index 100% rename from Video-Transformers-Kotlin/settings.gradle rename to Media-Transformers-Kotlin/settings.gradle diff --git a/Video-Transformers-Kotlin/README.md b/Video-Transformers-Kotlin/README.md deleted file mode 100644 index f3aaad91..00000000 --- a/Video-Transformers-Kotlin/README.md +++ /dev/null @@ -1,86 +0,0 @@ -Video Transformers -====================== - -The Video Transformers app is a very simple application created on top of Basic Video Chat meant to get a new developer -started using Media Processor APIs on OpenTok Android SDK. For a full description, see the [Video Transformers tutorial at the -OpenTok developer center](https://tokbox.com/developer/guides/vonage-media-processor/android). - -You can use pre-built transformers in the Vonage Media Processor library or create your own custom video transformer to apply to published video. - -You can use the PublisherKit.setAudioTransformers() and -PublisherKit.setVideoTransformers() -methods to apply audio and video transformers to a stream. - -For video, you can apply the background blur video transformer included in the Vonage Media Library. - -You can also create your own custom audio and video transformers. - -## Applying a video transformer from the Vonage Media Library - -Use the PublisherKit.VideoTransformer(String name, String properties) -constructor to create a video transformer that uses a named transformer from the Vonage Media Library. - -Currently, only one transformer is supported: background blur. Set the `name` parameter to `"BackgroundBlur"`. -Set the `properties` parameter to a JSON string defining properties for the transformer. -For the background blur transformer, this JSON includes one property -- `radius` -- which can be set -to `"High"`, `"Low"`, or `"None"`. - -```java -var videoTransformers: ArrayList = ArrayList() -val backgroundBlur = publisher!!.VideoTransformer("BackgroundBlur", "{\"radius\":\"High\"}") -videoTransformers.add(backgroundBlur) -publisher!!.setVideoTransformers(videoTransformers) -``` - -## Creating a custom video transformer - -Create a class that implements the PublisherKit.CustomVideoTransformer -interface. Implement the `PublisherKit.CustomVideoTransformer.onTransform​(BaseVideoRenderer.Frame frame)` method. The `PublisherKit.CustomVideoTransformer.onTransform​(BaseVideoRenderer.Frame frame)` method is triggered for each video frame. -In the implementation of the method, apply a transformation to the `frame` object passed into the method: - -```java -public class MyCustomTransformer implements PublisherKit.CustomVideoTransformer { - @Override - public void onTransform(BaseVideoRenderer.Frame frame) { - // Replace this with code to transform the frame: - frame.convertInPlace(frame.getYplane(), frame.getVplane(), frame.getUplane(), frame.getYstride(), frame.getUvStride()); - } -} -``` - -Then pass the object that implements the PublisherKit.CustomVideoTransformer interface into the `PublisherKit.setVideoTransformers()` method: - -```java -var videoTransformers: ArrayList = ArrayList() -val myCustomTransformer = publisher!!.VideoTransformer("myTransformer", logoTransformer) -videoTransformers.add(myCustomTransformer) -publisher!!.setVideoTransformers(videoTransformers) -``` - -You can combine the Vonage Media library transformer (see the previous section) with custom transformers or apply -multiple custom transformers by adding multiple PublisherKit.VideoTransformer objects to the ArrayList passed -into the `PublisherKit.setVideoTransformers()` method. - -Then pass the object that implements the PublisherKit.CustomAudioRransformer interface into the `PublisherKit.setAudioTransformers()` method: - -```java -var videoTransformers: ArrayList = ArrayList() -val backgroundBlur = publisher!!.VideoTransformer("BackgroundBlur", "{\"radius\":\"High\"}") -val myCustomTransformer = publisher!!.VideoTransformer("myTransformer", logoTransformer) -videoTransformers.add(backgroundBlur) -videoTransformers.add(myCustomTransformer) -publisher!!.setVideoTransformers(videoTransformers) -``` - -You can apply multiple custom transformers by adding multiple PublisherKit.VideoTransformer objects to the ArrayList -passed into the `PublisherKit.setVideoTransformers()` method. - -## Clearing video transformers for a publisher - -To clear video transformers for a publisher, pass an empty ArrayList into -into the `PublisherKit.setVideoTransformers()` method. - -```java -videoTransformers.clear(); -publisher!!.setVideoTransformers(videoTransformers) -``` diff --git a/Video-Transformers-Kotlin/build.gradle b/Video-Transformers-Kotlin/build.gradle deleted file mode 100644 index 0ccd671e..00000000 --- a/Video-Transformers-Kotlin/build.gradle +++ /dev/null @@ -1,10 +0,0 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. -plugins { - id 'com.android.application' version '7.1.2' apply false - id 'com.android.library' version '7.1.2' apply false - id 'org.jetbrains.kotlin.android' version '1.6.10' apply false -} - -task clean(type: Delete) { - delete rootProject.buildDir -} \ No newline at end of file