diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/FrameworkMuxer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/FrameworkMuxer.java index 737e1285f5..fc5b65891d 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/FrameworkMuxer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/FrameworkMuxer.java @@ -42,7 +42,7 @@ import java.nio.ByteBuffer; @Override public FrameworkMuxer create(String path, String outputMimeType) throws IOException { MediaMuxer mediaMuxer = new MediaMuxer(path, mimeTypeToMuxerOutputFormat(outputMimeType)); - return new FrameworkMuxer(mediaMuxer, outputMimeType); + return new FrameworkMuxer(mediaMuxer); } @RequiresApi(26) @@ -53,7 +53,7 @@ import java.nio.ByteBuffer; new MediaMuxer( parcelFileDescriptor.getFileDescriptor(), mimeTypeToMuxerOutputFormat(outputMimeType)); - return new FrameworkMuxer(mediaMuxer, outputMimeType); + return new FrameworkMuxer(mediaMuxer); } @Override @@ -65,47 +65,46 @@ import java.nio.ByteBuffer; } return true; } + + @Override + public boolean supportsSampleMimeType( + @Nullable String sampleMimeType, String containerMimeType) { + // MediaMuxer supported sample formats are documented in MediaMuxer.addTrack(MediaFormat). + boolean isAudio = MimeTypes.isAudio(sampleMimeType); + boolean isVideo = MimeTypes.isVideo(sampleMimeType); + if (containerMimeType.equals(MimeTypes.VIDEO_MP4)) { + if (isVideo) { + return MimeTypes.VIDEO_H263.equals(sampleMimeType) + || MimeTypes.VIDEO_H264.equals(sampleMimeType) + || MimeTypes.VIDEO_MP4V.equals(sampleMimeType) + || (Util.SDK_INT >= 24 && MimeTypes.VIDEO_H265.equals(sampleMimeType)); + } else if (isAudio) { + return MimeTypes.AUDIO_AAC.equals(sampleMimeType) + || MimeTypes.AUDIO_AMR_NB.equals(sampleMimeType) + || MimeTypes.AUDIO_AMR_WB.equals(sampleMimeType); + } + } else if (containerMimeType.equals(MimeTypes.VIDEO_WEBM) && SDK_INT >= 21) { + if (isVideo) { + return MimeTypes.VIDEO_VP8.equals(sampleMimeType) + || (Util.SDK_INT >= 24 && MimeTypes.VIDEO_VP9.equals(sampleMimeType)); + } else if (isAudio) { + return MimeTypes.AUDIO_VORBIS.equals(sampleMimeType); + } + } + return false; + } } private final MediaMuxer mediaMuxer; - private final String outputMimeType; private final MediaCodec.BufferInfo bufferInfo; private boolean isStarted; - private FrameworkMuxer(MediaMuxer mediaMuxer, String outputMimeType) { + private FrameworkMuxer(MediaMuxer mediaMuxer) { this.mediaMuxer = mediaMuxer; - this.outputMimeType = outputMimeType; bufferInfo = new MediaCodec.BufferInfo(); } - @Override - public boolean supportsSampleMimeType(@Nullable String mimeType) { - // MediaMuxer supported sample formats are documented in MediaMuxer.addTrack(MediaFormat). - boolean isAudio = MimeTypes.isAudio(mimeType); - boolean isVideo = MimeTypes.isVideo(mimeType); - if (outputMimeType.equals(MimeTypes.VIDEO_MP4)) { - if (isVideo) { - return MimeTypes.VIDEO_H263.equals(mimeType) - || MimeTypes.VIDEO_H264.equals(mimeType) - || MimeTypes.VIDEO_MP4V.equals(mimeType) - || (Util.SDK_INT >= 24 && MimeTypes.VIDEO_H265.equals(mimeType)); - } else if (isAudio) { - return MimeTypes.AUDIO_AAC.equals(mimeType) - || MimeTypes.AUDIO_AMR_NB.equals(mimeType) - || MimeTypes.AUDIO_AMR_WB.equals(mimeType); - } - } else if (outputMimeType.equals(MimeTypes.VIDEO_WEBM) && SDK_INT >= 21) { - if (isVideo) { - return MimeTypes.VIDEO_VP8.equals(mimeType) - || (Util.SDK_INT >= 24 && MimeTypes.VIDEO_VP9.equals(mimeType)); - } else if (isAudio) { - return MimeTypes.AUDIO_VORBIS.equals(mimeType); - } - } - return false; - } - @Override public int addTrack(Format format) { String sampleMimeType = checkNotNull(format.sampleMimeType); diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Muxer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Muxer.java index b00fbadfd5..20a868edb2 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Muxer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Muxer.java @@ -25,11 +25,12 @@ import java.nio.ByteBuffer; /** * Abstracts media muxing operations. * - *

Query whether {@link #supportsSampleMimeType(String) sample MIME types are supported} and - * {@link #addTrack(Format) add all tracks}, then {@link #writeSampleData(int, ByteBuffer, boolean, - * long) write sample data} to mux samples. Once any sample data has been written, it is not - * possible to add tracks. After writing all sample data, {@link #release(boolean) release} the - * instance to finish writing to the output and return any resources to the system. + *

Query whether {@link Factory#supportsOutputMimeType(String) container MIME type} and {@link + * Factory#supportsSampleMimeType(String, String) sample MIME types} are supported and {@link + * #addTrack(Format) add all tracks}, then {@link #writeSampleData(int, ByteBuffer, boolean, long) + * write sample data} to mux samples. Once any sample data has been written, it is not possible to + * add tracks. After writing all sample data, {@link #release(boolean) release} the instance to + * finish writing to the output and return any resources to the system. */ /* package */ interface Muxer { @@ -62,10 +63,13 @@ import java.nio.ByteBuffer; /** Returns whether the {@link MimeTypes MIME type} provided is a supported output format. */ boolean supportsOutputMimeType(String mimeType); - } - /** Returns whether the sample {@link MimeTypes MIME type} is supported. */ - boolean supportsSampleMimeType(@Nullable String mimeType); + /** + * Returns whether the sample {@link MimeTypes MIME type} is supported with the given container + * {@link MimeTypes MIME type}. + */ + boolean supportsSampleMimeType(@Nullable String sampleMimeType, String containerMimeType); + } /** * Adds a track with the specified format, and returns its index (to be passed in subsequent calls diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MuxerWrapper.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MuxerWrapper.java index 6127fd567a..e8a217f645 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MuxerWrapper.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MuxerWrapper.java @@ -45,8 +45,10 @@ import java.nio.ByteBuffer; private static final long MAX_TRACK_WRITE_AHEAD_US = C.msToUs(500); private final Muxer muxer; + private final Muxer.Factory muxerFactory; private final SparseIntArray trackTypeToIndex; private final SparseLongArray trackTypeToTimeUs; + private final String containerMimeType; private int trackCount; private int trackFormatCount; @@ -54,8 +56,10 @@ import java.nio.ByteBuffer; private @C.TrackType int previousTrackType; private long minTrackTimeUs; - public MuxerWrapper(Muxer muxer) { + public MuxerWrapper(Muxer muxer, Muxer.Factory muxerFactory, String containerMimeType) { this.muxer = muxer; + this.muxerFactory = muxerFactory; + this.containerMimeType = containerMimeType; trackTypeToIndex = new SparseIntArray(); trackTypeToTimeUs = new SparseLongArray(); previousTrackType = C.TRACK_TYPE_NONE; @@ -78,7 +82,7 @@ import java.nio.ByteBuffer; /** Returns whether the sample {@link MimeTypes MIME type} is supported. */ public boolean supportsSampleMimeType(@Nullable String mimeType) { - return muxer.supportsSampleMimeType(mimeType); + return muxerFactory.supportsSampleMimeType(mimeType, containerMimeType); } /** diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java index 02db36c6ad..61feaf5dd0 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java @@ -100,6 +100,7 @@ public final class TranscodingTransformer { private boolean removeVideo; private boolean flattenForSlowMotion; private String outputMimeType; + @Nullable private String audioMimeType; private TranscodingTransformer.Listener listener; private Looper looper; private Clock clock; @@ -122,6 +123,7 @@ public final class TranscodingTransformer { this.removeVideo = transcodingTransformer.transformation.removeVideo; this.flattenForSlowMotion = transcodingTransformer.transformation.flattenForSlowMotion; this.outputMimeType = transcodingTransformer.transformation.outputMimeType; + this.audioMimeType = transcodingTransformer.transformation.audioMimeType; this.listener = transcodingTransformer.listener; this.looper = transcodingTransformer.looper; this.clock = transcodingTransformer.clock; @@ -212,10 +214,8 @@ public final class TranscodingTransformer { } /** - * Sets the MIME type of the output. The default value is {@link MimeTypes#VIDEO_MP4}. The - * output MIME type should be supported by the {@link - * Muxer.Factory#supportsOutputMimeType(String) muxer}. Values supported by the default {@link - * FrameworkMuxer} are: + * Sets the MIME type of the output. The default value is {@link MimeTypes#VIDEO_MP4}. Supported + * values are: * *