转换

不同格式之间的转码

您可以在构建 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();

视频编辑

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.setVideoEffects 在 ExoPlayer 中预览视频特效。

演示版应用包含自定义视频特效示例。

音频编辑

音效是通过将一系列 AudioProcessor 实例应用于原始 (PCM) 音频来实现的。ExoPlayer 支持将音频处理器传递给 DefaultAudioSink.Builder,以便预览音频编辑效果。