首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android 視頻播放:TextureView 黑邊問題本質與正確處理姿勢

     編輯:程式設計疑難解答

現象

使用 MediaPlayer + TextureView 播放視頻,上下/左右出現黑邊,全屏模式下依然存在。

核心結論

黑邊非 Bug,而是播放器為「保持視頻原始寬高比」而自動添加的信箱/柱狀邊距。 視頻幀尺寸與 TextureView 顯示區域尺寸不匹配時,系統默認 等比縮放 + 居中,多餘區域填黑。

為何「去除黑邊」是偽需求?

  • 強制拉伸填滿 → 畫面變形(圓變橢圓、人變胖/瘦),用戶體驗極差。
  • 裁剪填滿 → 丟失畫面邊緣信息(字幕、關鍵動作被切掉)。

正確解決方案:適配而非消除

方案一:調整 TextureView 顯示區域尺寸(推薦)

在 onVideoSizeChanged 或 onPrepared 中,根據視頻寬高比動態設定 TextureView 的 LayoutParams,使其與視頻幀比例一致,父佈局背景設為黑色。

@Override
public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
    float videoAspect = (float) width / height;
    int viewWidth = getWidth();
    int viewHeight = getHeight();
    float viewAspect = (float) viewWidth / viewHeight;

    ViewGroup.LayoutParams lp = getLayoutParams();
    if (videoAspect > viewAspect) {
        // 視頻更寬 → 高度撐滿,寬度等比
        lp.width = (int) (viewHeight * videoAspect);
        lp.height = viewHeight;
    } else {
        // 視頻更高 → 寬度撐滿,高度等比
        lp.width = viewWidth;
        lp.height = (int) (viewWidth / videoAspect);
    }
    setLayoutParams(lp);
}

方案二:使用 SurfaceView + 自定義佈局(舊方案)

SurfaceView 繪製在窗口後方,需自行管理 Z-order 與縮放,TextureView 更靈活(支援動畫、透明度、旋轉),首選 TextureView。

方案三:ExoPlayer / Media3(現代最佳實踐)

Google 官方媒體庫內建 AspectRatioFrameLayout,自動處理比例適配、旋轉、HDR、DRM,極大降低坑位。

implementation "androidx.media3:media3-exoplayer:1.4.0"
implementation "androidx.media3:media3-ui:1.4.0"

總結

不要試圖「去除黑邊」,要通過「調整顯示區域比例」或「使用成熟播放器庫」實現正確的視頻呈現。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved