MediaMuxer 类

定义

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 有助于对基本流进行复用。 目前 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.MediaMuxerJava 文档。

此页面的部分内容是基于 创建和共享的工作进行的修改,并根据 署名许可中所述的术语使用。

构造函数

MediaMuxer(FileDescriptor, MuxerOutputType)

创建写入指定 FileDescriptor 的媒体复用器。

MediaMuxer(String, MuxerOutputType)

创建写入指定路径的媒体复用器。

属性

Class

返回此 Object的运行时类。

(继承自 Object)
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 有助于对基本流进行复用。

适用于