在外层演示应用程序中,根据视频的纵横比更改表面视图的纵横比



我已经使用以下代码在我的Android应用程序中实现了ExoPlayer。

String versionName;
        try {
            String packageName = getPackageName();
            PackageInfo info = getPackageManager().getPackageInfo(packageName, 0);
            versionName = info.versionName;
        } catch (PackageManager.NameNotFoundException e) {
            versionName = "?";
        }
        player = ExoPlayer.Factory.newInstance(2);

        Allocator allocator = new DefaultAllocator(BUFFER_SEGMENT_SIZE);
        DataSource dataSource = new DefaultUriDataSource(this, null, versionName);
        MediaPresentationDescriptionParser parser = new MediaPresentationDescriptionParser();
        UriDataSource manifestDataSource = new DefaultUriDataSource(this, versionName);
        ManifestFetcher<MediaPresentationDescription> manifestFetcher = new ManifestFetcher<>(passedWorkoutObject.workoutMediaURL, manifestDataSource, parser);
        ExtractorSampleSource sampleSource = new ExtractorSampleSource(
                Uri.parse(VIDEO_URL), dataSource, allocator, BUFFER_SEGMENT_COUNT * BUFFER_SEGMENT_SIZE);
        MediaCodecVideoTrackRenderer videoRenderer = new MediaCodecVideoTrackRenderer(
                this, sampleSource, MediaCodec.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);
        MediaCodecAudioTrackRenderer audioRenderer = new MediaCodecAudioTrackRenderer(sampleSource);
        player.prepare(videoRenderer, audioRenderer);
        player.sendMessage(videoRenderer, MediaCodecVideoTrackRenderer.MSG_SET_SURFACE, surface);
        player.setPlayWhenReady(true);
        control = new PlayerControl(player);

然而,问题是我需要播放所有方面比率的视频。如何调整surfaceView以适应视频的大小,而不是相反?

请记住,我在AndroidManifest中为项目中包含ExoPlayer的活动使用android:screenOrientation="sensorLandscape",以下是我根据视频的纵横比更改SurfaceView的纵横比的方法。

1.将SurfaceView放入容器(FrameLayout)中,容器大小将更改:

<FrameLayout
        android:id="@+id/rootView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/colorBlack"
        android:focusable="true"
        android:keepScreenOn="true">
        <FrameLayout
            android:id="@+id/video_frame"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center">
            <SurfaceView
                android:id="@+id/surfaceView"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_gravity="center" />
        </FrameLayout>
</FrameLayout>

2.根据视频的纵横比更改容器大小:

private void applyAspectRatio(FrameLayout container, SimpleExoPlayer exoPlayer) {
        float videoRatio = (float) exoPlayer.getVideoFormat().width/exoPlayer.getVideoFormat().height;
        Display display = getActivity().getWindowManager().getDefaultDisplay();
        Point size = new Point();
        display.getSize(size);
        float displayRatio = (float) size.x/size.y;
        if (videoRatio > displayRatio) {
            Log.d(TAG, "applying " + videoRatio + "aspectRatio");
            container.getLayoutParams().height = Math.round(container.getMeasuredWidth()/videoRatio);
            container.requestLayout();
        } else {
            Log.d(TAG, "applying usual aspectRatio");
            FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
            params.gravity = CENTER;
            container.setLayoutParams(params);
        }
    }

3.将此applyAspectRatio()方法放入Activity或Fragment的onPlayerStateChanged回调方法中(必须实现ExoPlayer.EventListener接口):

@Override
    public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
        if (playbackState == ExoPlayer.STATE_READY) applyAspectRatio();
    }

最新更新