MediaSync 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
MediaSync 類別可用於同步播放音訊與視訊串流。
[Android.Runtime.Register("android/media/MediaSync", ApiSince=23, DoNotGenerateAcw=true)]
public sealed class MediaSync : Java.Lang.Object
[<Android.Runtime.Register("android/media/MediaSync", ApiSince=23, DoNotGenerateAcw=true)>]
type MediaSync = class
inherit Object
- 繼承
- 屬性
備註
MediaSync 類別可用於同步播放音訊與視訊串流。 它也可以用來播放純音訊或純視訊串流。
MediaSync 通常的使用方式如下:
MediaSync sync = new MediaSync();
sync.setSurface(surface);
Surface inputSurface = sync.createInputSurface();
...
// MediaCodec videoDecoder = ...;
videoDecoder.configure(format, inputSurface, ...);
...
sync.setAudioTrack(audioTrack);
sync.setCallback(new MediaSync.Callback() {
{@literal @Override}
public void onAudioBufferConsumed(MediaSync sync, ByteBuffer audioBuffer, int bufferId) {
...
}
}, null);
// This needs to be done since sync is paused on creation.
sync.setPlaybackParams(new PlaybackParams().setSpeed(1.f));
for (;;) {
...
// send video frames to surface for rendering, e.g., call
// videoDecoder.releaseOutputBuffer(videoOutputBufferIx, videoPresentationTimeNs);
// More details are available as below.
...
sync.queueAudio(audioByteBuffer, bufferId, audioPresentationTimeUs); // non-blocking.
// The audioByteBuffer and bufferId will be returned via callback.
// More details are available as below.
...
...
}
sync.setPlaybackParams(new PlaybackParams().setSpeed(0.f));
sync.release();
sync = null;
// The following code snippet illustrates how video/audio raw frames are created by
// MediaCodec's, how they are fed to MediaSync and how they are returned by MediaSync.
// This is the callback from MediaCodec.
onOutputBufferAvailable(MediaCodec codec, int bufferId, BufferInfo info) {
// ...
if (codec == videoDecoder) {
// surface timestamp must contain media presentation time in nanoseconds.
codec.releaseOutputBuffer(bufferId, 1000 * info.presentationTime);
} else {
ByteBuffer audioByteBuffer = codec.getOutputBuffer(bufferId);
sync.queueAudio(audioByteBuffer, bufferId, info.presentationTime);
}
// ...
}
// This is the callback from MediaSync.
onAudioBufferConsumed(MediaSync sync, ByteBuffer buffer, int bufferId) {
// ...
audioDecoder.releaseBuffer(bufferId, false);
// ...
}
客戶端需要根據串流類型設定 Surface 和/或 AudioTrack,來設定相應的 sink。
對於影片,客戶端需要呼叫 #createInputSurface 取得一個能渲染影片幀的表面。
對於音訊,用戶端需要正確設定音軌,例如使用 AudioTrack#MODE_STREAM。 音訊緩衝區會直接 #queueAudio透過 傳送到 MediaSync,然後透過 Callback#onAudioBufferConsumed 非同步方式回傳給用戶端。 客戶端不應該修改音訊緩衝區,直到它被回傳。
用戶端可選擇性地預先填充音訊/視訊緩衝區,將播放速率設為 0.0,然後將音訊/視訊緩衝區餵給相應元件。 這可以減少初期可能的欠支。
Java 文件 android.media.MediaSync。
本頁部分內容為基於 Open Source Project 所創建與分享的作品,並依授權條款所描述的使用進行修改。
建構函式
| 名稱 | Description |
|---|---|
| MediaSync() |
職業建造者。 |
屬性
| 名稱 | Description |
|---|---|
| Class |
回傳此 |
| Handle |
底層 Android 實例的帳號。 (繼承來源 Object) |
| JniIdentityHashCode |
取得由互通執行時指派給此 Java 對等端的身份雜湊碼。 (繼承來源 Object) |
| JniManagedPeerState |
MediaSync 類別可用於同步播放音訊與視訊串流。 (繼承來源 JavaObject) |
| JniPeerMembers |
MediaSync 類別可用於同步播放音訊與視訊串流。 |
| PeerReference |
取得這個 Java 節點的 JNI 物件參考。 (繼承來源 Object) |
| PlaybackParams |
用 取得播放率。 |
| SyncParams |
會開啟影音同步模式。 -或- 設定影音同步模式。 |
| ThresholdClass |
此 API 支援 Mono for Android 基礎架構,並非直接從你的程式碼中使用。 (繼承來源 Object) |
| ThresholdType |
此 API 支援 Mono for Android 基礎架構,並非直接從你的程式碼中使用。 (繼承來源 Object) |
| Timestamp |
查詢目前的播放位置。 |
方法
| 名稱 | Description |
|---|---|
| Clone() |
建立並回傳此物件的副本。 (繼承來源 Object) |
| Construct(JniObjectReference, JniObjectReferenceOptions) |
MediaSync 類別可用於同步播放音訊與視訊串流。 (繼承來源 JavaObject) |
| CreateInputSurface() |
請求一個 Surface 作為輸入。 |
| Dispose() |
釋放該 Java 節點所持有的資源。 (繼承來源 Object) |
| Dispose(Boolean) |
釋放該 Java 節點所持有的資源。 (繼承來源 Object) |
| DisposeUnlessReferenced() |
MediaSync 類別可用於同步播放音訊與視訊串流。 (繼承來源 JavaObject) |
| Equals(Object) |
MediaSync 類別可用於同步播放音訊與視訊串流。 (繼承來源 JavaObject) |
| Equals(Object) |
表示是否有其他物體「等同」於此物。 (繼承來源 Object) |
| Flush() |
清除同步物件中的所有緩衝區。 |
| GetHashCode() |
回傳物件的雜湊碼值。 (繼承來源 Object) |
| JavaFinalize() |
已淘汰.
當垃圾回收判定該物件不再有相關參考時,由垃圾回收器呼叫。 (繼承來源 Object) |
| Notify() |
喚醒一個正在該物件監視器上等待的執行緒。 (繼承來源 Object) |
| NotifyAll() |
喚醒所有等待該物件監視器的執行緒。 (繼承來源 Object) |
| QueueAudio(ByteBuffer, Int32, Int64) |
非同步排隊播放音訊資料(AudioTrack 必須處於串流模式)。 |
| Release() |
完成後一定要呼叫這個,這樣可以釋放任何已開啟的元件實例,而不是依賴垃圾回收器未來某個時候幫你處理。 |
| SetAudioTrack(AudioTrack) |
設定 MediaSync 的音軌。 |
| SetCallback(MediaSync+Callback, Handler) |
為可操作的 MediaSync 事件設定非同步回撥。 |
| SetHandle(IntPtr, JniHandleOwnership) |
設定 Handle 屬性。 (繼承來源 Object) |
| SetOnErrorListener(MediaSync+IOnErrorListener, Handler) |
為錯誤事件設定非同步回撥。 |
| SetPeerReference(JniObjectReference, JniObjectReferenceOptions) |
MediaSync 類別可用於同步播放音訊與視訊串流。 (繼承來源 JavaObject) |
| SetSurface(Surface) |
設定 MediaSync 的輸出表面。 |
| ToArray<T>() |
從這個 Java 陣列包裝器建立一個受管理陣列。 (繼承來源 Object) |
| ToString() |
回傳物件的字串表示。 (繼承來源 Object) |
| UnregisterFromRuntime() |
將此 Java 節點從互通執行時中取消註冊。 (繼承來源 Object) |
| Wait() |
導致目前執行緒等待被喚醒,通常是透過 <em>通知</><em 或 em>中斷</em> 來喚醒。 (繼承來源 Object) |
| Wait(Int64, Int32) |
會讓目前執行緒等待喚醒,通常是透過 <em>通知</><em 或 em>中斷</em>,或是經過一定的真實時間。 (繼承來源 Object) |
| Wait(Int64) |
會讓目前執行緒等待喚醒,通常是透過 <em>通知</><em 或 em>中斷</em>,或是經過一定的真實時間。 (繼承來源 Object) |
明確介面實作
| 名稱 | Description |
|---|---|
| IJavaPeerable.Disposed() |
MediaSync 類別可用於同步播放音訊與視訊串流。 (繼承來源 JavaObject) |
| IJavaPeerable.Finalized() |
MediaSync 類別可用於同步播放音訊與視訊串流。 (繼承來源 JavaObject) |
| IJavaPeerable.JniObjectReferenceControlBlock |
MediaSync 類別可用於同步播放音訊與視訊串流。 (繼承來源 JavaObject) |
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
MediaSync 類別可用於同步播放音訊與視訊串流。 (繼承來源 JavaObject) |
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
MediaSync 類別可用於同步播放音訊與視訊串流。 (繼承來源 JavaObject) |
| IJavaPeerable.SetPeerReference(JniObjectReference) |
MediaSync 類別可用於同步播放音訊與視訊串流。 (繼承來源 JavaObject) |
擴充方法
| 名稱 | Description |
|---|---|
| GetJniTypeName(IJavaPeerable) |
取得實例 |
| JavaAs<TResult>(IJavaPeerable) |
試著強制 |
| JavaCast<TResult>(IJavaObject) |
執行 Android 執行時檢查型別轉換。 |
| JavaCast<TResult>(IJavaObject) |
MediaSync 類別可用於同步播放音訊與視訊串流。 |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
試著強制 |