转换

在不同格式之间转码

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

KotlinJava
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();

如果输入媒体格式与音频配置匹配 或视频,Transformer 会自动切换为转换,也就是复制 压缩样本从输入容器传送到输出容器, 修改。这样可以避免 以相同的格式进行解码和重新编码。

移除音频或视频

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

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

剪辑片段

您可以移除指定开始和结束时间戳以外的任何媒体,只需设置 输入媒体项的剪辑配置。例如,要生成 仅包含 10 秒到 20 秒之间的媒体的剪辑:

KotlinJava
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();

优化剪辑

如需缩短剪辑视频开头时的延迟时间,请启用剪辑功能 优化。

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

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

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

我们正在验证此功能,预计将变为非实验性功能 。

视频编辑

EditedMediaItems 包含要应用的音频处理器和视频特效列表 订单。该库包含适用于常见用例的视频特效实现, 或者,你可以编写自定义效果,并在制作编辑过的媒体时传入这些效果 项。

您可以重新缩放媒体,这有助于节省处理资源或 带宽。 例如,要按比例缩放至 480 像素高:

KotlinJava
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();

或者,您也可以按指定系数进行缩放,例如,将大小减半:

KotlinJava
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();

您可以按以下方式配置轮替:

KotlinJava
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 序列实现的 实例转换为原始 (PCM) 音频。ExoPlayer 支持将音频处理器传递给 DefaultAudioSink.Builder:允许预览音频修改。