转换

在格式之间进行转码

在构建 Transformer 时,您可以指定要生成的输出音频和视频格式。例如,以下代码展示了如何配置 Transformer 以输出 H.264/AVC 视频和 AAC 音频

Kotlin

Transformer.Builder(context)
    .setVideoMimeType(MimeTypes.VIDEO_H264)
    .setAudioMimeType(MimeTypes.AUDIO_AAC)
    .build()

Java

new Transformer.Builder(context)
    .setVideoMimeType(MimeTypes.VIDEO_H264)
    .setAudioMimeType(MimeTypes.AUDIO_AAC)
    .build();

如果输入媒体格式已与音频或视频的配置匹配,Transformer 会自动切换到转封装,即在不修改的情况下,将压缩后的样本从输入容器复制到输出容器。这样可以避免在相同格式下解码和重新编码带来的计算成本和潜在的质量损失。

删除音频或视频

使用 EditedMediaItem.Builder 删除音频或视频,例如

Kotlin

EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build()

Java

new EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build();

修剪剪辑

您可以通过在输入媒体项目上设置剪切配置来删除指定开始和结束时间戳之外的任何媒体。例如,要生成一个仅包含 10 秒到 20 秒之间媒体的剪辑

Kotlin

val inputMediaItem = MediaItem.Builder()
    .setUri(uri)
    .setClippingConfiguration(
        ClippingConfiguration.Builder()
            .setStartPositionMs(10_000)
            .setEndPositionMs(20_000)
            .build())
    .build()

Java

MediaItem inputMediaItem =
    new MediaItem.Builder()
        .setUri(uri)
        .setClippingConfiguration(
            new MediaItem.ClippingConfiguration.Builder()
                .setStartPositionMs(10_000)
                .setEndPositionMs(20_000)
                .build())
        .build();

优化修剪

要减少修剪视频开头的延迟,请启用修剪优化。

Kotlin

Transformer.Builder(context)
    .experimentalSetTrimOptimizationEnabled(true)
    .build()

Java

new Transformer.Builder(context)
    .experimentalSetTrimOptimizationEnabled(true)
    .build();

这通过尽可能少地解码和重新编码视频来加快导出速度,然后将重新编码的数据与原始视频的其余部分拼接在一起。优化依赖于能够将输入文件的一部分与新编码的输出拼接在一起,这意味着编码器的输出格式和输入格式必须兼容。因此,例如,如果文件最初是在具有不同编码器实现的设备上生成的,那么可能无法应用优化。为了使优化成功,通过 EncoderFactory 提供给 Transformer 的编码器必须具有与输入格式兼容的级别和配置文件。

此优化仅适用于没有效果(除了无操作视频效果和可被 90 度整除的旋转)的单资产 MP4 输入。如果优化失败,Transformer 会自动回退到正常导出,并在 ExportResult.OptimizationResult 中报告优化的结果。

我们正在验证此功能,预计它将在以后的版本中成为非实验性功能。

视频编辑

EditedMediaItems 有音频处理器和视频效果列表,这些列表按顺序应用。该库包含用于常见用例的视频效果实现,或者您可以在构建已编辑媒体项目时编写自定义效果并将其传入。

您可以重新缩放媒体,这在处理非常高分辨率的输入(例如 4k 或 8k 视频)时可能有助于节省处理资源或带宽。例如,要按比例缩放到 480 像素高

Kotlin

EditedMediaItem.Builder(MediaItem.fromUri(uri))
    .setEffects(Effects(
        /* audioProcessors= */ listOf(),
        /* videoEffects= */ listOf(Presentation.createForHeight(480))
    )).build()

Java

new EditedMediaItem.Builder(MediaItem.fromUri(uri))
    .setEffects(new Effects(
        /* audioProcessors= */ ImmutableList.of(),
        /* videoEffects= */ ImmutableList.of(Presentation.createForHeight(480))))
    .build();

或者,您可以按给定比例进行缩放,例如,将大小减半

Kotlin

val editedMediaItem = EditedMediaItem.Builder(MediaItem.fromUri(uri))
    .setEffects(Effects(
        /* audioProcessors= */ listOf(),
        /* videoEffects= */ listOf(
            ScaleAndRotateTransformation.Builder().setScale(.5f, .5f).build())
    )).build()

Java

new EditedMediaItem.Builder(MediaItem.fromUri(uri))
    .setEffects(new Effects(
        /* audioProcessors= */ ImmutableList.of(),
        /* videoEffects= */ ImmutableList.of(
            new ScaleAndRotateTransformation.Builder().setScale(.5f, .5f).build())))
    .build();

您可以以相同的方式配置旋转

Kotlin

EditedMediaItem.Builder(MediaItem.fromUri(uri))
    .setEffects(Effects(
        /* audioProcessors= */ listOf(),
        /* videoEffects= */ listOf(
            ScaleAndRotateTransformation.Builder()
                .setRotationDegrees(90f)
                .build())
    )).build()

Java

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 实例应用于原始 (PCM) 音频来实现的。ExoPlayer 支持将音频处理器传递给 DefaultAudioSink.Builder,这允许预览音频编辑。