mirror of
https://github.com/androidx/media.git
synced 2025-04-30 06:46:50 +08:00
Add raw audio support to Mp4Muxer.
The fourcc used is `sowt` for little endian 16 bit PCM and `twos` for big endian 16 bit PCM. PiperOrigin-RevId: 724391195
This commit is contained in:
parent
1190980616
commit
0ba3bf66c6
@ -685,6 +685,7 @@ import org.checkerframework.checker.nullness.qual.PolyNull;
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Returns a codec specific box. */
|
/** Returns a codec specific box. */
|
||||||
|
@SuppressWarnings("MergeCases")
|
||||||
public static ByteBuffer codecSpecificBox(Format format) {
|
public static ByteBuffer codecSpecificBox(Format format) {
|
||||||
String mimeType = checkNotNull(format.sampleMimeType);
|
String mimeType = checkNotNull(format.sampleMimeType);
|
||||||
switch (mimeType) {
|
switch (mimeType) {
|
||||||
@ -697,6 +698,8 @@ import org.checkerframework.checker.nullness.qual.PolyNull;
|
|||||||
return damrBox(/* mode= */ (short) 0x83FF); // mode set: all enabled for AMR-WB
|
return damrBox(/* mode= */ (short) 0x83FF); // mode set: all enabled for AMR-WB
|
||||||
case MimeTypes.AUDIO_OPUS:
|
case MimeTypes.AUDIO_OPUS:
|
||||||
return dOpsBox(format);
|
return dOpsBox(format);
|
||||||
|
case MimeTypes.AUDIO_RAW:
|
||||||
|
return ByteBuffer.allocate(0); // No codec specific box for raw audio.
|
||||||
case MimeTypes.VIDEO_H263:
|
case MimeTypes.VIDEO_H263:
|
||||||
return d263Box(format);
|
return d263Box(format);
|
||||||
case MimeTypes.VIDEO_H264:
|
case MimeTypes.VIDEO_H264:
|
||||||
@ -1690,6 +1693,14 @@ import org.checkerframework.checker.nullness.qual.PolyNull;
|
|||||||
return "s263";
|
return "s263";
|
||||||
case MimeTypes.AUDIO_OPUS:
|
case MimeTypes.AUDIO_OPUS:
|
||||||
return "Opus";
|
return "Opus";
|
||||||
|
case MimeTypes.AUDIO_RAW:
|
||||||
|
if (format.pcmEncoding == C.ENCODING_PCM_16BIT) {
|
||||||
|
return "sowt";
|
||||||
|
} else if (format.pcmEncoding == C.ENCODING_PCM_16BIT_BIG_ENDIAN) {
|
||||||
|
return "twos";
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException("Unsupported PCM encoding: " + format.pcmEncoding);
|
||||||
|
}
|
||||||
case MimeTypes.VIDEO_H264:
|
case MimeTypes.VIDEO_H264:
|
||||||
return "avc1";
|
return "avc1";
|
||||||
case MimeTypes.VIDEO_H265:
|
case MimeTypes.VIDEO_H265:
|
||||||
|
@ -58,6 +58,7 @@ import java.nio.ByteBuffer;
|
|||||||
* <li>AMR-WB (Wideband AMR)
|
* <li>AMR-WB (Wideband AMR)
|
||||||
* <li>Opus
|
* <li>Opus
|
||||||
* <li>Vorbis
|
* <li>Vorbis
|
||||||
|
* <li>Raw Audio
|
||||||
* </ul>
|
* </ul>
|
||||||
* <li>Metadata
|
* <li>Metadata
|
||||||
* </ul>
|
* </ul>
|
||||||
@ -158,7 +159,8 @@ public final class FragmentedMp4Muxer implements AutoCloseable {
|
|||||||
MimeTypes.AUDIO_AMR_NB,
|
MimeTypes.AUDIO_AMR_NB,
|
||||||
MimeTypes.AUDIO_AMR_WB,
|
MimeTypes.AUDIO_AMR_WB,
|
||||||
MimeTypes.AUDIO_OPUS,
|
MimeTypes.AUDIO_OPUS,
|
||||||
MimeTypes.AUDIO_VORBIS);
|
MimeTypes.AUDIO_VORBIS,
|
||||||
|
MimeTypes.AUDIO_RAW);
|
||||||
|
|
||||||
private final FragmentedMp4Writer fragmentedMp4Writer;
|
private final FragmentedMp4Writer fragmentedMp4Writer;
|
||||||
private final MetadataCollector metadataCollector;
|
private final MetadataCollector metadataCollector;
|
||||||
|
@ -82,6 +82,7 @@ import org.checkerframework.checker.nullness.qual.EnsuresNonNull;
|
|||||||
* <li>AMR-WB (Wideband AMR)
|
* <li>AMR-WB (Wideband AMR)
|
||||||
* <li>Opus
|
* <li>Opus
|
||||||
* <li>Vorbis
|
* <li>Vorbis
|
||||||
|
* <li>Raw Audio
|
||||||
* </ul>
|
* </ul>
|
||||||
* <li>Metadata
|
* <li>Metadata
|
||||||
* </ul>
|
* </ul>
|
||||||
@ -361,7 +362,8 @@ public final class Mp4Muxer implements AutoCloseable {
|
|||||||
MimeTypes.AUDIO_AMR_NB,
|
MimeTypes.AUDIO_AMR_NB,
|
||||||
MimeTypes.AUDIO_AMR_WB,
|
MimeTypes.AUDIO_AMR_WB,
|
||||||
MimeTypes.AUDIO_OPUS,
|
MimeTypes.AUDIO_OPUS,
|
||||||
MimeTypes.AUDIO_VORBIS);
|
MimeTypes.AUDIO_VORBIS,
|
||||||
|
MimeTypes.AUDIO_RAW);
|
||||||
|
|
||||||
private static final String TAG = "Mp4Muxer";
|
private static final String TAG = "Mp4Muxer";
|
||||||
|
|
||||||
|
@ -73,6 +73,7 @@ public class Mp4MuxerEndToEndParameterizedTest {
|
|||||||
private static final String AMR_WB_3GP = "bbb_mono_16kHz_23.05kbps_amrwb.3gp";
|
private static final String AMR_WB_3GP = "bbb_mono_16kHz_23.05kbps_amrwb.3gp";
|
||||||
private static final String OPUS_OGG = "bbb_6ch_8kHz_opus.ogg";
|
private static final String OPUS_OGG = "bbb_6ch_8kHz_opus.ogg";
|
||||||
private static final String VORBIS_OGG = "bbb_1ch_16kHz_q10_vorbis.ogg";
|
private static final String VORBIS_OGG = "bbb_1ch_16kHz_q10_vorbis.ogg";
|
||||||
|
private static final String RAW_WAV = "bbb_2ch_44kHz.wav";
|
||||||
|
|
||||||
@Parameters(name = "{0}")
|
@Parameters(name = "{0}")
|
||||||
public static ImmutableList<String> mediaSamples() {
|
public static ImmutableList<String> mediaSamples() {
|
||||||
@ -92,7 +93,8 @@ public class Mp4MuxerEndToEndParameterizedTest {
|
|||||||
AMR_NB_3GP,
|
AMR_NB_3GP,
|
||||||
AMR_WB_3GP,
|
AMR_WB_3GP,
|
||||||
OPUS_OGG,
|
OPUS_OGG,
|
||||||
VORBIS_OGG);
|
VORBIS_OGG,
|
||||||
|
RAW_WAV);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Parameter public @MonotonicNonNull String inputFile;
|
@Parameter public @MonotonicNonNull String inputFile;
|
||||||
|
BIN
libraries/test_data/src/test/assets/media/mp4/bbb_2ch_44kHz.wav
Normal file
BIN
libraries/test_data/src/test/assets/media/mp4/bbb_2ch_44kHz.wav
Normal file
Binary file not shown.
@ -0,0 +1,63 @@
|
|||||||
|
seekMap:
|
||||||
|
isSeekable = true
|
||||||
|
duration = 1000000
|
||||||
|
getPosition(0) = [[timeUs=0, position=400052]]
|
||||||
|
getPosition(1) = [[timeUs=1, position=400052]]
|
||||||
|
getPosition(500000) = [[timeUs=500000, position=488252]]
|
||||||
|
getPosition(1000000) = [[timeUs=1000000, position=558812]]
|
||||||
|
numberOfTracks = 1
|
||||||
|
track 0:
|
||||||
|
total output bytes = 40
|
||||||
|
sample count = 10
|
||||||
|
track duration = 1000000
|
||||||
|
format 0:
|
||||||
|
id = 1
|
||||||
|
containerMimeType = audio/mp4
|
||||||
|
sampleMimeType = audio/raw
|
||||||
|
maxInputSize = 34
|
||||||
|
channelCount = 2
|
||||||
|
sampleRate = 44100
|
||||||
|
pcmEncoding = 2
|
||||||
|
language = ```
|
||||||
|
metadata = entries=[Mp4Timestamp: creation time=100000000, modification time=500000000, timescale=10000]
|
||||||
|
sample 0:
|
||||||
|
time = 0
|
||||||
|
flags = 1
|
||||||
|
data = length 4, hash F0FD1
|
||||||
|
sample 1:
|
||||||
|
time = 100000
|
||||||
|
flags = 1
|
||||||
|
data = length 4, hash FFDB3408
|
||||||
|
sample 2:
|
||||||
|
time = 200000
|
||||||
|
flags = 1
|
||||||
|
data = length 4, hash 47510F
|
||||||
|
sample 3:
|
||||||
|
time = 300000
|
||||||
|
flags = 1
|
||||||
|
data = length 4, hash 35B613
|
||||||
|
sample 4:
|
||||||
|
time = 400000
|
||||||
|
flags = 1
|
||||||
|
data = length 4, hash 333956
|
||||||
|
sample 5:
|
||||||
|
time = 500000
|
||||||
|
flags = 1
|
||||||
|
data = length 4, hash FFF14579
|
||||||
|
sample 6:
|
||||||
|
time = 600000
|
||||||
|
flags = 1
|
||||||
|
data = length 4, hash 3620FE
|
||||||
|
sample 7:
|
||||||
|
time = 700000
|
||||||
|
flags = 1
|
||||||
|
data = length 4, hash C488D
|
||||||
|
sample 8:
|
||||||
|
time = 800000
|
||||||
|
flags = 1
|
||||||
|
data = length 4, hash FFF6FBD8
|
||||||
|
sample 9:
|
||||||
|
time = 900000
|
||||||
|
flags = 536870913
|
||||||
|
data = length 4, hash FFDD4C2A
|
||||||
|
tracksEnded = true
|
Loading…
x
Reference in New Issue
Block a user