TextureVideo, медиаплеер и соотношение сторон

У меня есть TextureView, в котором показывается видео, видео, ранее записанное с помощью камеры устройства. Изображение в видео растянуто, что недопустимо. Я провел небольшое исследование и нашел этот метод:

private void adjustAspectRatio(int videoWidth, int videoHeight) {
    int viewWidth = m_TextureView.getWidth();
    int viewHeight = m_TextureView.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();
    m_TextureView.getTransform(txform);
    txform.setScale((float) newWidth / viewWidth, (float) newHeight / viewHeight);
    //txform.postRotate(10);          // just for fun
    txform.postTranslate(xoff, yoff);
    m_TextureView.setTransform(txform);
}

Пытался его использовать, но вижу только черный фон.

Это muSurfaceTextureAvailable, если это помогает:

@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {


    isVideoResultReady=true;

    Surface s=new Surface(surface);
    if(mPlayer==null){
        mPlayer=new MediaPlayer();
    }


    try {
        //mPlayer.setDataSource(videoPath);
        mPlayer.setSurface(s);
        mPlayer.prepare();
        mPlayer.setOnBufferingUpdateListener(this);
        mPlayer.setOnCompletionListener(this);
        mPlayer.setOnPreparedListener(this);
        //media player is started in other point of the app

    } catch (IOException e) {
        e.printStackTrace();
    }
}

Что не так с этим методом? Как сохранить пропорции? Благодарю.

0 ответов

Другие вопросы по тегам