형식 간 트랜스코딩
동영상 출력 및 캡션 생성 시 생성하고자 하는 출력 오디오 및 동영상 형식을 살펴보겠습니다 예를 들어, 다음 코드는 H.264/AVC 동영상 및 AAC 오디오를 출력하도록 Transformer를 구성합니다.
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는 transmuxing으로 자동 전환되어 압축된 샘플을 입력 컨테이너에서 출력 컨테이너로 있습니다. 이를 통해 시스템의 전산 비용과 잠재적 품질 손실을 디코딩 및 다시 인코딩하는 데 사용됩니다.
오디오 또는 동영상 삭제
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
에는 입력 형식과 호환되는 수준 및 프로필이 있어야 합니다.
이 최적화는
90도로 나눌 수 있는 회전 동영상 효과 없음 최적화가
실패하면 Transformer는 자동으로 정상 내보내기로 대체하고
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
시퀀스를 적용하여 구현합니다.
원시 (PCM) 오디오로 변환할 수 있습니다 ExoPlayer는 오디오 프로세서를
DefaultAudioSink.Builder
: 오디오 수정사항을 미리 볼 수 있습니다.