分享影片的最佳做法

許多人使用 Android 裝置分享影片。接收的 影片往往會因為需要處理 透過分享應用程式本文件說明如何將 分享的影片,以及一些應避免的常見影片處理問題。進行最佳化 如要瞭解如何分享 HDR 影片內容,請參閱 本頁面的使用 Transformer 模組將 HDR 轉碼為 SDR

最主要的任務是維持固定的解析度,並維持影片畫質 在準備分享影片時,越長越好。

共用管道

圖 1 說明常見的影片分享流程:

分享影片管道 圖 1. 影片分享管道。

管道包含下列步驟:

  1. 拍攝影片並編碼後,你也可以在拍攝期間添加特效。 或者,使用者可以選擇略過這個步驟,然後從儲存空間選取影片 擷取自其他應用程式預錄的內容
  2. 編輯、篩選、修飾或處理影片。
  3. 縮放或調整影片大小,準備進行轉碼。
  4. 將影片轉碼以便分享。步驟 2 中的篩選功能通常會套用於

管道包含兩個步驟 決定影片品質的參數:初始期間的編碼 錄製、轉碼或轉碼後另外,您可能也需要 在最終轉碼步驟之前重新調整影片大小,這也會影響品質。

建議

表 1 列出與影片畫質有關的五大參數 ,指出可以使用這些方法的步驟。

參數 擷取 分享
「個人檔案」 可以 可以
解決方法 可以 可以
位元率 可以 可以
量化參數 (QP) (很少) 可以
B 影格 可以

表 1. 決定影片品質的主要參數

個人資料

為了取得更準確的結果,請使用特定項目提供的進階設定檔 轉碼器。如果是 AVC 編碼,請選取「高設定檔」和「等級 4」。

解析度、裁剪和縮放

您可以在縮放步驟中變更已拍攝影片的初始解析度 進行轉碼後,擴充儲存功能可能會 影片。建議您避免調度資源,並選擇初始的解析度 這種編碼方式可在整個管道中使用同時提醒你 裁剪會導致圖片品質不佳,特別是在放大裁剪範圍的情況下 圖片。請遵循下列規範:

  • 請選擇至少與最終分享解析度相同的解析度。
  • 拍攝解析度不應遠大於分享解析度 除非所有的中繼步驟都能支援 (例如初始擷取期間的位元率較高)。

    • 如果共用編碼會產生 720x1280 的解析度,建議您 720x1280 拍攝解析度。
    • 如果擷取和分享之間的中間步驟包括裁剪,請使用 1080x1920 等較高的拍攝解析度 擷取位元率來處理額外的像素。
  • 極端裁剪會導致圖片畫質不佳 圖片已調大。

  • 避免從較低解析度提升至較高解析度。向上擴充嘗試 建立不存在的詳細資料。以想要的更高解析度播放 都以相同的設計為重

  • 如果您必須提高複雜度,請調整編碼參數。舉例來說,如果 高階解析度的像素是兩倍,則是位元率的兩倍。

解析度和位元率彼此交互影響。例如提供 透過共用管道最終轉碼為低位元率 比起先選取解析度較低的圖片,產生的圖片畫質較低。身為 因為位元率會降低,但解析度會變小的跨點點 以產生更好的結果:

位元率 解決方法
5 Mbps 以上 1080x1920
1.5 至 5 Mbps 以上 720x1280
1.5 Mbps 以下 相當於 SD 標準畫質。長寬比 9:16 相同的像素數量約為 416x736

表 2. 位元率與解析度

許多熱門應用程式都會以 720p 或更低的解析度分享影片。透過資料 720p 解析度 適合 1.5 以下的位元率目標 和 5 Mbps

位元率

錄製中

編碼位元率較高,可大幅提升影片品質 品質建議你選擇符合原生相機應用程式的位元率。換 720x1280 解析度 (建議的擷取位元率為 10 Mbps)。

由於擷取編碼是在裝置上完成,因此您可以使用較高的位元率 彌補大部分的共用步驟轉換,幾乎沒有負數 這種做法較大的產生的檔案只會用於在裝置上操縱。

您可以在最後一個轉碼步驟降低位元率,如表 2 所示。

分享

位元率在分享時間影響最大,因為該數據與 上傳中影片的大小影片之間需要權衡 品質、檔案傳輸時間和雲端儲存空間費用。

編碼設定檔、B 框架和 QP 的定界值選擇也可以 這個階段的重要性更勝於拍攝期間

建議你選擇介於 4 到 5 Mbps 之間的位元率 (720x1280 解析度),確保影片良好 圖像品質

量化參數 (QP)

在 Android 12 以上版本中,QP 金鑰會標準化,並可在 MediaFormat敬上 API 和 NDK 媒體庫。 在較舊的 Android 版本中,只能使用架構操控 QP 操作 函式。MediaFormat

錄製中

錄影期間,請採用位元率控制項,而非 QP 設定。 不一定每次都能使用

我們不建議針對 10 Mbps 的擷取位元率調整 QP 設定 (適用於 720x1280)。若擷取位元率明顯低,則傳輸速率小於 5 Mbps 720x1280 (QP 設定 40) 在品質提升之間最好 不必強制讓轉碼器過度射擊目標位元率。

分享

建議您將 QP 上限設為 40,特別是在位元率低於 4 Mbps 時。 這個做法能確保已編碼的影片達到最低畫質,但可以產生 導致位元率較高的結果位元率的升幅取決於 複雜的影片雖然共用應用程式可能容許 但可能無法容許增加 特定門檻。

如要限制位元率提高,可以重新編碼影片, 限制 (較高) 的 QP 上限值。如此一來,轉碼器就能更自由地 可以犧牲品質並保留影片的其他片段。如要重新編碼 可供分享,因為這是轉碼作業您已經 拍攝了您想要分享的影片。

缺點是,要使用這些不同的程式碼 參數會增加分享影片所需的時間。減少 這是因為要檢查部分轉碼後的影片 避免位元率過高如果沒有,您可以停止 轉碼,然後使用更適當的 QP 參數再試一次。

B 框架和編碼設定檔

建議只在共用步驟中使用 B 框,且僅在執行時 搭載 Android 10 以上版本。

應用程式應使用 CodecCapabilities、 因為並非所有裝置都支援主要或高的設定檔。使用最高的商家檔案 AVC 編碼器支援:高 >主要 >基準。為求安全,請勿 設定 B 框架 (KEY_LATENCYKEY_MAX_B_FRAMES) 使用基準值時 因為某些編碼器可能無法設定

以下程式碼區段假設 'MediaFormat format' 將用於 設定 AVC 編碼器

Android 10

API 29 以上

使用系統支援的最高設定檔,並將 B-Frame 參數設為 1:

format.setInt32(KEY_PROFILE, AVCProfileHigh);
format.setInt32(KEY_MAX_B_FRAMES, 1);

在這種情況下,請勿設定 KEY_LATENCY

Android 8、8.1 和 9

API 26、27、28

使用支援的最高設定檔,但停用產生 B 框架的功能。這個 也會遵守 這些系統版本中的 MediaMuxer

format.setInt32(KEY_PROFILE, AVCProfileHigh);
format.setInt32(KEY_LATENCY, 1);

KEY_LATENCY 值禁止轉碼器產生 B 影格,但仍可 也可利用其他轉碼器的效率。

如果應用程式未使用 MediaMuxer 組合最終輸出檔案,您可以 將 KEY_LATENCY 值設為 2 (而非 1) 以啟用 B 框架。這應該 可讓轉碼器產生 B 影格

Android 7.1 以下版本

API 25 以下版本

請使用基準設定檔取得最安全的結果。

format.setInt32(KEY_PROFILE, AVCProfileBaseline);

在第 7 版之前,Android 開放原始碼計畫僅支援基準設定檔。不過 可能是因為原始設備製造商 (OEM) 在部分裝置上啟用了主要/高階設定檔 建立供應商專用簡介

如果您的應用程式未使用 MediaMuxer,您可以在以下時機使用主要或高設定檔: 。沒有公用格式金鑰可以控制 B- 相輔相成。

使用 Transformer 模組將 HDR 轉碼為 SDR

從 Android 13 (API 級別 33) 開始,建議使用 Jetpack Media3 的 變壓器 模組,將 HDR 內容分享給搭載以下作業系統的應用程式、服務和裝置: 都支援 HDRTransformer 模組的運作方式是將 將 HDR 影片串流輸入至 SDR 中,並將結果儲存為 MP4,以 成功播放時不會失去細節或影像亮度

注意:指定 Android 12 (API 級別 32) 版本之間的系統版本的裝置。 到 Android 7.0 (API 級別 24) 之間,Transformer 模組的運作方式有所不同。如果 裝置支援 HDR,則您的應用程式會重新播放內容,而不使用色調對應。 如果裝置不支援 HDR,系統會顯示錯誤,指出 HDR 影片 不支援色調對應。

下列程式碼會設定 Transformer,以便將輸入對應至 SDR 和 將其重新編碼成輸入格式 (例如 H.264/AVC):

Kotlin

val transformer = Transformer.Builder(context)
    .setTransformationRequest(
        TransformationRequest.Builder()
            .setHdrMode(TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR)
            .build())
    .addListener(/* ... */)
    .build()

Java

Transformer transformer = new Transformer.Builder(context)
    .setTransformationRequest(
        new TransformationRequest.Builder()
            .setHdrMode(TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR)
            .build())
    .addListener(/* ... */)
    .build();

如要試用色調對應功能,請參閱 Transformer 試用版應用程式

你也可以使用 MediaCodec,不過實作 較複雜詳情請參閱 MediaCodec 參考說明文件。