15

我正在使用纹理视图在表面上从我的服务器播放视频,但它会拉伸视频并且无法保持视频的纵横比。但是,我希望像在 vine 应用程序或 instagram 应用程序中一样保持视频的纵横比。

4

4 回答 4

15

您可以更改 View 的大小(使用自定义 FrameLayout),或使用 TextureView 矩阵更改纹理的渲染方式。

两者的例子都可以在Grafika中找到。“播放视频(TextureView)”活动演示了配置矩阵以匹配视频的纵横比。看adjustAspectRatio()方法,其核心是:

    Matrix txform = new Matrix();
    mTextureView.getTransform(txform);
    txform.setScale((float) newWidth / viewWidth, (float) newHeight / viewHeight);
    txform.postTranslate(xoff, yoff);
    mTextureView.setTransform(txform);

请注意,它会居中并缩放视频。

于 2014-12-11T17:03:54.660 回答
8

好吧,我来不及回答,但正如我从Grafika那里得到的那样,您可以使用此功能

 private void adjustAspectRatio(int videoWidth, int videoHeight) {
    int viewWidth = mTextureView.getWidth();
    int viewHeight = mTextureView.getHeight();
    double aspectRatio = (double) videoHeight / videoWidth;

    int newWidth, newHeight;
    if (viewHeight > (int) (viewWidth * aspectRatio)) {
        // limited by narrow width; restrict height
        newWidth = viewWidth;
        newHeight = (int) (viewWidth * aspectRatio);
    } else {
        // limited by short height; restrict width
        newWidth = (int) (viewHeight / aspectRatio);
        newHeight = viewHeight;
    }
    int xoff = (viewWidth - newWidth) / 2;
    int yoff = (viewHeight - newHeight) / 2;
    Log.v(TAG, "video=" + videoWidth + "x" + videoHeight +
            " view=" + viewWidth + "x" + viewHeight +
            " newView=" + newWidth + "x" + newHeight +
            " off=" + xoff + "," + yoff);

    Matrix txform = new Matrix();
    mTextureView.getTransform(txform);
    txform.setScale((float) newWidth / viewWidth, (float) newHeight / viewHeight);
    //txform.postRotate(10);          // just for fun
    txform.postTranslate(xoff, yoff);
    mTextureView.setTransform(txform);
}
于 2016-08-26T14:03:47.213 回答
1

您可以使用 ExoPlayer https://github.com/google/ExoPlayer#并查看完整的演示。它完美地保持了视频宽高比。

于 2014-12-11T08:35:29.647 回答
0

扩展上面 fadden 的答案:如果您想以其他方式对齐视频而不是仅仅将其居中,请在 Grafika 的“adjustAspectRatio()”代码中修改这些行:

int xoff = (viewWidth - newWidth) / 2;
int yoff = (viewHeight - newHeight) / 2;

到:

int xoff = 0; //align left

或者

int xoff = (viewWidth - newWidth); // align right

或者

int yoff = 0; // align top

或者

int yoff = (viewHeight - newHeight); // align bottom
于 2016-06-30T13:03:53.690 回答