許多人使用 Android 裝置分享影片。接收的 影片往往會因為需要處理 透過分享應用程式本文件說明如何將 分享的影片,以及一些應避免的常見影片處理問題。進行最佳化 如要瞭解如何分享 HDR 影片內容,請參閱 本頁面的使用 Transformer 模組將 HDR 轉碼為 SDR。
最主要的任務是維持固定的解析度,並維持影片畫質 在準備分享影片時,越長越好。
共用管道
圖 1 說明常見的影片分享流程:
管道包含下列步驟:
- 拍攝影片並編碼後,你也可以在拍攝期間添加特效。 或者,使用者可以選擇略過這個步驟,然後從儲存空間選取影片 擷取自其他應用程式預錄的內容
- 編輯、篩選、修飾或處理影片。
- 縮放或調整影片大小,準備進行轉碼。
- 將影片轉碼以便分享。步驟 2 中的篩選功能通常會套用於
管道包含兩個步驟 決定影片品質的參數:初始期間的編碼 錄製、轉碼或轉碼後另外,您可能也需要 在最終轉碼步驟之前重新調整影片大小,這也會影響品質。
建議
表 1 列出與影片畫質有關的五大參數 ,指出可以使用這些方法的步驟。
參數 | 擷取 | 分享 |
「個人檔案」 | 可以 | 可以 |
解決方法 | 可以 | 可以 |
位元率 | 可以 | 可以 |
量化參數 (QP) | (很少) | 可以 |
B 影格 | 北 | 可以 |
個人資料
為了取得更準確的結果,請使用特定項目提供的進階設定檔 轉碼器。如果是 AVC 編碼,請選取「高設定檔」和「等級 4」。
解析度、裁剪和縮放
您可以在縮放步驟中變更已拍攝影片的初始解析度 進行轉碼後,擴充儲存功能可能會 影片。建議您避免調度資源,並選擇初始的解析度 這種編碼方式可在整個管道中使用同時提醒你 裁剪會導致圖片品質不佳,特別是在放大裁剪範圍的情況下 圖片。請遵循下列規範:
- 請選擇至少與最終分享解析度相同的解析度。
拍攝解析度不應遠大於分享解析度 除非所有的中繼步驟都能支援 (例如初始擷取期間的位元率較高)。
- 如果共用編碼會產生 720x1280 的解析度,建議您 720x1280 拍攝解析度。
- 如果擷取和分享之間的中間步驟包括裁剪,請使用 1080x1920 等較高的拍攝解析度 擷取位元率來處理額外的像素。
極端裁剪會導致圖片畫質不佳 圖片已調大。
避免從較低解析度提升至較高解析度。向上擴充嘗試 建立不存在的詳細資料。以想要的更高解析度播放 都以相同的設計為重
如果您必須提高複雜度,請調整編碼參數。舉例來說,如果 高階解析度的像素是兩倍,則是位元率的兩倍。
解析度和位元率彼此交互影響。例如提供 透過共用管道最終轉碼為低位元率 比起先選取解析度較低的圖片,產生的圖片畫質較低。身為 因為位元率會降低,但解析度會變小的跨點點 以產生更好的結果:
位元率 | 解決方法 |
5 Mbps 以上 | 1080x1920 |
1.5 至 5 Mbps 以上 | 720x1280 |
1.5 Mbps 以下 | 相當於 SD 標準畫質。長寬比 9:16 相同的像素數量約為 416x736 |
許多熱門應用程式都會以 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_LATENCY
或
KEY_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
參考說明文件。