MediaMuxer 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
MediaMuxer 有助于对基本流进行复用。
[Android.Runtime.Register("android/media/MediaMuxer", DoNotGenerateAcw=true)]
public sealed class MediaMuxer : Java.Lang.Object
[<Android.Runtime.Register("android/media/MediaMuxer", DoNotGenerateAcw=true)>]
type MediaMuxer = class
inherit Object
- 继承
- 属性
注解
MediaMuxer 有助于对基本流进行复用。 目前 MediaMuxer 支持 MP4、Webm 和 3GP 文件作为输出。 自 Android Nougat 以来,它还支持在 MP4 中复用 B 帧。
它通常如下所示:
MediaMuxer muxer = new MediaMuxer("temp.mp4", OutputFormat.MUXER_OUTPUT_MPEG_4);
// More often, the MediaFormat will be retrieved from MediaCodec.getOutputFormat()
// or MediaExtractor.getTrackFormat().
MediaFormat audioFormat = new MediaFormat(...);
MediaFormat videoFormat = new MediaFormat(...);
int audioTrackIndex = muxer.addTrack(audioFormat);
int videoTrackIndex = muxer.addTrack(videoFormat);
ByteBuffer inputBuffer = ByteBuffer.allocate(bufferSize);
boolean finished = false;
BufferInfo bufferInfo = new BufferInfo();
muxer.start();
while(!finished) {
// getInputBuffer() will fill the inputBuffer with one frame of encoded
// sample from either MediaCodec or MediaExtractor, set isAudioSample to
// true when the sample is audio data, set up all the fields of bufferInfo,
// and return true if there are no more samples.
finished = getInputBuffer(inputBuffer, isAudioSample, bufferInfo);
if (!finished) {
int currentTrackIndex = isAudioSample ? audioTrackIndex : videoTrackIndex;
muxer.writeSampleData(currentTrackIndex, inputBuffer, bufferInfo);
}
};
muxer.stop();
muxer.release();
<h4>元数据跟踪</h4>
每帧元数据携带与视频或音频关联的信息,以便于脱机处理。 例如,来自传感器的陀螺仪信号有助于在进行脱机处理时实现视频稳定。 仅当多路复用为 MP4 容器格式时,才支持元数据跟踪。 添加新的元数据跟踪时,MIME 类型格式必须以前缀“application/” (例如“application/gyro”) 开头。 元数据的格式是应用程序定义的。 元数据时间戳必须与视频和音频时间戳位于同一时间基。 生成的 MP4 文件使用 ISOBMFF 规范) 第 12.3.3.2 节中定义的 TextMetaDataSampleEntry (来向元数据的 MIME 类型发出信号。
MediaMuxer muxer = new MediaMuxer("temp.mp4", OutputFormat.MUXER_OUTPUT_MPEG_4);
// SetUp Video/Audio Tracks.
MediaFormat audioFormat = new MediaFormat(...);
MediaFormat videoFormat = new MediaFormat(...);
int audioTrackIndex = muxer.addTrack(audioFormat);
int videoTrackIndex = muxer.addTrack(videoFormat);
// Setup Metadata Track
MediaFormat metadataFormat = new MediaFormat(...);
metadataFormat.setString(KEY_MIME, "application/gyro");
int metadataTrackIndex = muxer.addTrack(metadataFormat);
muxer.start();
while(..) {
// Allocate bytebuffer and write gyro data(x,y,z) into it.
ByteBuffer metaData = ByteBuffer.allocate(bufferSize);
metaData.putFloat(x);
metaData.putFloat(y);
metaData.putFloat(z);
BufferInfo metaInfo = new BufferInfo();
// Associate this metadata with the video frame by setting
// the same timestamp as the video frame.
metaInfo.presentationTimeUs = currentVideoTrackTimeUs;
metaInfo.offset = 0;
metaInfo.flags = 0;
metaInfo.size = bufferSize;
muxer.writeSampleData(metadataTrackIndex, metaData, metaInfo);
};
muxer.stop();
muxer.release();
}
<h2 id=History>“History”>功能和 API History</h2>
下表总结了不同 API 版本和容器中的功能支持。 有关 API 版本号,请参阅 android.os.Build.VERSION_CODES
。
<style> .api > tr > th, .api > tr > td { text-align: center; padding: 4px 4px; } .api > tr > th { vertical-align: bottom; } .api > tr > td { vertical-align: middle; } .sml > tr > th, .sml > tr > td { text-align: center; padding: 2px 4px; } .fn { text-align: center; }</风格>
<table align=“right” style=“width: 0%”>thead<>tbody class=api><tr><th>Symbol</th><>meaning/th/th meaning/th/th meaning</th/tbody<><><>/thead<>tbody class=sml><tr><td>●</td><td>Supported</td></tr<>><td>○</td><td>Not supported</td></tr><<>td>▧</td><td>支持 in<MP4/WebM/3GP</td></tr><<>td>⁕</td td><>仅在 MP4</td></tr<>/tbody<>/table<>table align=“center” style=“width: 100%;”><thead class=api><tr><th rowspan=2>Feature</th><th colspan=“24”>SDK Version</th></tr<>th><>18</th><th>19</th><>20</th>><th 21</th><>22</th<>>23</th<>>24</th><>25</th<>>th 26+</th></tr></thead><tbody class=api><tr><td align=“center”>MP4 container</td><td●</td<>td>>●</td><td>●</td<>td>●</td<>td>●</td><td>●</td<>td>●</td><td>●</td td><><●/td td>><< align=“center”>WebM container</td><td○</td><td>>○</td<>td>○</td><td>●</td<>td>●</td<>td>●</td><td>●</td<>td>●</td><td>●</td></tr><td align=“center”>3GP container</td<>td○</td<>td>>○</td<>td>○</td><td>○</td><td>○</td td><>○</td<>td>○</td><td>○</td<>td>●</td<>/tr><td align=“center”>复用 B 帧 (双向预测帧) </td td>○</td<>><td>○/td><td>○<</td><td>○</td td<>>○</td<>td>○/td><td>⁕<</td><td>⁕</td><td>⁕</td<>/tr<>/tr><td align=“center”>Muxing Single Video/Audio Track</td><td>▧</td><td>▧</td><td>▧</td><td>▧</td><td>▧</td td><>▧</td<>td>▧</td<>td>▧</td<>td>▧</td></tr<>/tr><td align=“center”>复用多视频/音频轨道</td td><>○</td<>td>○</td<>td>○</td<>td>○</td<>td>○</td><td>○</td<>td>○</td<>td>○</td<>td>⁕</td></tr<>/td><align=“center”>复用元数据跟踪</td td>><○</td><td>○</td><td>○</td<>td>○</td<>td>○</td<>td>○</td<>td>○</td<>td>○</td<>td>⁕</td<>/tbody><></table>
的 android.media.MediaMuxer
Java 文档。
此页面的部分内容是基于 创建和共享的工作进行的修改,并根据 署名许可中所述的术语使用。
构造函数
MediaMuxer(FileDescriptor, MuxerOutputType) |
创建写入指定 FileDescriptor 的媒体复用器。 |
MediaMuxer(String, MuxerOutputType) |
创建写入指定路径的媒体复用器。 |
属性
Class |
返回此 |
Handle |
基础 Android 实例的句柄。 (继承自 Object) |
JniIdentityHashCode |
MediaMuxer 有助于对基本流进行复用。 (继承自 Object) |
JniPeerMembers |
MediaMuxer 有助于对基本流进行复用。 |
PeerReference |
MediaMuxer 有助于对基本流进行复用。 (继承自 Object) |
ThresholdClass |
此 API 支持 Mono for Android 基础结构,不应直接从代码使用。 (继承自 Object) |
ThresholdType |
此 API 支持 Mono for Android 基础结构,不应直接从代码使用。 (继承自 Object) |
方法
AddTrack(MediaFormat) |
添加具有指定格式的轨道。 |
Clone() |
创建并返回此对象的副本。 (继承自 Object) |
Dispose() |
MediaMuxer 有助于对基本流进行复用。 (继承自 Object) |
Dispose(Boolean) |
MediaMuxer 有助于对基本流进行复用。 (继承自 Object) |
Equals(Object) |
指示其他某个对象是否“等于”此对象。 (继承自 Object) |
GetHashCode() |
返回对象的哈希代码值。 (继承自 Object) |
JavaFinalize() |
当垃圾回收确定不再引用对象时,由对象上的垃圾回收器调用。 (继承自 Object) |
Notify() |
唤醒正在等待此对象的监视器的单个线程。 (继承自 Object) |
NotifyAll() |
唤醒正在等待此对象的监视器的所有线程。 (继承自 Object) |
Release() |
在释放任何资源时,请确保调用此资源,而不是依赖垃圾回收器在将来的某个时间点为你执行此操作。 |
SetHandle(IntPtr, JniHandleOwnership) |
设置 Handle 属性。 (继承自 Object) |
SetLocation(Single, Single) |
在输出文件中设置和存储 (纬度和经度) 地理数据。 |
SetOrientationHint(Int32) |
设置输出视频播放的方向提示。 |
Start() |
启动复用器。 |
Stop() |
停止复用器。 |
ToArray<T>() |
MediaMuxer 有助于对基本流进行复用。 (继承自 Object) |
ToString() |
返回对象的字符串表示形式。 (继承自 Object) |
UnregisterFromRuntime() |
MediaMuxer 有助于对基本流进行复用。 (继承自 Object) |
Wait() |
导致当前线程等待,直到它被唤醒,通常是通过 em <通知/em> 或 <em>interrupted</em>。<> (继承自 Object) |
Wait(Int64) |
导致当前线程等待,直到它被唤醒,通常是通过 em <通知/em> 或 <em>interrupted</em>,或直到经过一定数量的实时。<> (继承自 Object) |
Wait(Int64, Int32) |
导致当前线程等待,直到它被唤醒,通常是通过 em <通知/em> 或 <em>interrupted</em>,或直到经过一定数量的实时。<> (继承自 Object) |
WriteSampleData(Int32, ByteBuffer, MediaCodec+BufferInfo) |
将编码的示例写入复用器。 |
显式接口实现
IJavaPeerable.Disposed() |
MediaMuxer 有助于对基本流进行复用。 (继承自 Object) |
IJavaPeerable.DisposeUnlessReferenced() |
MediaMuxer 有助于对基本流进行复用。 (继承自 Object) |
IJavaPeerable.Finalized() |
MediaMuxer 有助于对基本流进行复用。 (继承自 Object) |
IJavaPeerable.JniManagedPeerState |
MediaMuxer 有助于对基本流进行复用。 (继承自 Object) |
IJavaPeerable.SetJniIdentityHashCode(Int32) |
MediaMuxer 有助于对基本流进行复用。 (继承自 Object) |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
MediaMuxer 有助于对基本流进行复用。 (继承自 Object) |
IJavaPeerable.SetPeerReference(JniObjectReference) |
MediaMuxer 有助于对基本流进行复用。 (继承自 Object) |
扩展方法
JavaCast<TResult>(IJavaObject) |
执行 Android 运行时检查的类型转换。 |
JavaCast<TResult>(IJavaObject) |
MediaMuxer 有助于对基本流进行复用。 |
GetJniTypeName(IJavaPeerable) |
MediaMuxer 有助于对基本流进行复用。 |