ExoPlayer2 Zoomable View?

时间:2018-05-27 22:29:22

标签: android-layout exoplayer2.x

对于Exoplayer的第一个版本和原始Android媒体播放器,似乎有几个相同答案的克隆,但它们不能在Exoplayer2上编译,Exoplayer2重新组织了相当多的内部代码。

一个相当勤奋的搜索没有找到任何阻碍图书馆或示例代码的方式(例如捏缩放和滚动等)​​。为静止图像做了很多代码(例如通过毕加索等获取)

有没有人有可以构建和使用ExoPlayer2的示例?

提前致谢!

更新:问题似乎是我不能将VideoListener子类化或附加到SimpleExoPlayer实例;尝试这样做会让你没有任何东西,因为实例已经附加了自己的侦听器,当涉及到TextureView时,它只关注纵横比。这使视频完全无法使用;一个监听器可以很容易地纠正它,但似乎无法附加它(这样做的方法被标记为已弃用,如果你尝试使用它们,则无法获得视频输出。)

此代码将绘制并运行ua.pohohalo.zoomabletextureview(或仅仅是一个普通的TextureView),但我无法将视频附加到默认情况下,当它初始化时,将视频适合于在纵向模式下查看尺寸垂直会破坏纵横比。如果您将视频调整到显示窗口大小以下,它也会有严重的故障,但我可以在polohalo的代码中测试并修复它。我还没想到要做的是让原始显示器符合原始宽高比或附加一个VideoListener来在init上设置它 - 如果我使用PlayerView,它可以正常工作,但是那个'无法扩展以支持翻译。 " VideoListener"此代码块中的原型应该修复宽高比问题 - 这是我无法附加或找到在原始视图上设置标志的方法(也可以完成工作)告诉ExoPlayer尊重原始宽高比并适合屏幕尺寸。

对于在PlayerView上工作的simpleExoPlayerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FIT)的调用在TextureView上无效 - 看起来模式默认为RESIZE_MODE_FILL,我找不到将其设置为FIT的方法。 / p>

package net.cudasystems.android.videotest;

import android.graphics.Matrix;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.TextureView;
import com.google.android.exoplayer2.DefaultLoadControl;
import com.google.android.exoplayer2.DefaultRenderersFactory;
import com.google.android.exoplayer2.ExoPlayerFactory;
import com.google.android.exoplayer2.SimpleExoPlayer;
import com.google.android.exoplayer2.source.ExtractorMediaSource;
import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
import com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory;

import com.google.android.exoplayer2.util.Util;
import com.google.android.exoplayer2.video.VideoListener;


public class MainActivity extends AppCompatActivity {

    private String mURL = "http://point-at-an-mp4-file";

    TextureView mPlayerView;

    SimpleExoPlayer player = null;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mPlayerView = findViewById(R.id.video_view2);
    }

    private void initializePlayer() {

        DefaultRenderersFactory renderersFactory =
                new DefaultRenderersFactory(this, DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON);

        VideoListener mVideoListener = new VideoListener() {
            @Override
            public void onRenderedFirstFrame() {

            }
            @Override
            public void onVideoSizeChanged(int width, int height, int rotation, float pixelWidthHeightRatio ) {
                String TAG = "VideoSizeChange";
                int viewWidth = mPlayerView.getWidth();
                int viewHeight = mPlayerView.getHeight();
                double aspectRatio = (double) height / width;

                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=" + width + "x" + height +
                        " view=" + viewWidth + "x" + viewHeight +
                        " newView=" + newWidth + "x" + newHeight +
                        " off=" + xoff + "," + yoff);

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

        };

        player = ExoPlayerFactory.newSimpleInstance(
                renderersFactory,
                new DefaultTrackSelector(), new DefaultLoadControl());


        player.setVideoTextureView(mPlayerView);

        // mPlayerView.setPlayer(player);

        player.setPlayWhenReady(true);

        Uri uri = Uri.parse(mURL);
        MediaSource mediaSource = buildMediaSource(uri);
        player.prepare(mediaSource, true, true);
    }


    private MediaSource buildMediaSource(Uri uri) {

        return new ExtractorMediaSource.Factory(
                new DefaultHttpDataSourceFactory("exoplayer-codelab")).
                createMediaSource(uri);
    }


    @Override
    public void onStart() {
        super.onStart();
        if (Util.SDK_INT > 23) {
            if (player == null) {
                initializePlayer();
            }
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        if ((Util.SDK_INT <= 23 || player == null)) {
            initializePlayer();
        }
    }
    @Override
    public void onPause() {
        super.onPause();
        if (Util.SDK_INT <= 23) {
            releasePlayer();
        }
    }
    @Override
    public void onStop() {
        super.onStop();
        if (Util.SDK_INT > 23) {
            releasePlayer();
        }
    }
    private void releasePlayer() {
        if (player != null) {
            player.release();
            player = null;
        }
    }

}

和XML文件一起使用....可缩放的声明是&#34; on&#34;现在,但代码可以轻松使用不可缩放的或PlayerView(通过更改类型而不附加纹理);一个人工作得很好,包括妥善处理轮换。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/root"
    android:focusable="true"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:keepScreenOn="true">

    <TextureView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:visibility="gone"
        android:id="@+id/video_view3" />

    <ua.polohalo.zoomabletextureview.ZoomableTextureView
        android:id="@+id/video_view2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="top"
        app:maxScale="4"/>

    <com.google.android.exoplayer2.ui.PlayerView
        android:id="@+id/video_view"
        android:visibility="gone"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:use_controller="false"/>

</FrameLayout>

更新:如果你试图在一个片段中使用它,那么下面的代码工作之后会有以下代码工作,在这种情况下,由于最小和最大比例值的拾取方式,TextView扩展会出现问题。显而易见的&#34; hack&#34;答案是检查minScale = 0并在发现未初始化时将其强制为1.0。

希望这有助于其他人。

package net.cudasystems.android.videotest;

import android.net.Uri;
import android.os.Bundle;
import android.support.constraint.ConstraintLayout;
import android.support.v7.app.AppCompatActivity;
import android.util.DisplayMetrics;
import android.view.TextureView;

import com.google.android.exoplayer2.DefaultLoadControl;
import com.google.android.exoplayer2.DefaultRenderersFactory;
import com.google.android.exoplayer2.ExoPlayerFactory;
import com.google.android.exoplayer2.SimpleExoPlayer;
import com.google.android.exoplayer2.source.ExtractorMediaSource;
import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
import com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory;

import com.google.android.exoplayer2.util.Util;


public class MainActivity extends AppCompatActivity {

    private String mURL = "http://set-to-an-mp4-URL"

    TextureView mPlayerView;

    SimpleExoPlayer player = null;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mPlayerView = findViewById(R.id.video_view);
    }

    private void initializePlayer() {

        DefaultRenderersFactory renderersFactory =
                new DefaultRenderersFactory(this, DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON);


        player = ExoPlayerFactory.newSimpleInstance(
                renderersFactory,
                new DefaultTrackSelector(), new DefaultLoadControl());


        DisplayMetrics metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);


        // Make sure the initial aspect ratio is 16:9 (otherwise a TextureView init's to the LARGER of
        // the two dimensions of the video irrespective of the orientation setting and screws the aspect ratio!)
        int width = metrics.widthPixels;
        int newHeight = (width * 9) / 16;
        mPlayerView.setLayoutParams(new ConstraintLayout.LayoutParams(width, newHeight));
        mPlayerView.invalidate();

        player.setVideoTextureView(mPlayerView);

        player.setPlayWhenReady(true);

        Uri uri = Uri.parse(mURL);
        MediaSource mediaSource = buildMediaSource(uri);
        player.prepare(mediaSource, true, true);
    }


    private MediaSource buildMediaSource(Uri uri) {

        return new ExtractorMediaSource.Factory(
                new DefaultHttpDataSourceFactory("exoplayer-codelab")).
                createMediaSource(uri);
    }


    @Override
    public void onStart() {
        super.onStart();
        if (Util.SDK_INT > 23) {
            if (player == null) {
                initializePlayer();
            }
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        if ((Util.SDK_INT <= 23 || player == null)) {
            initializePlayer();
        }
    }
    @Override
    public void onPause() {
        super.onPause();
        if (Util.SDK_INT <= 23) {
            releasePlayer();
        }
    }
    @Override
    public void onStop() {
        super.onStop();
        if (Util.SDK_INT > 23) {
            releasePlayer();
        }
    }
    private void releasePlayer() {
        if (player != null) {
            player.release();
            player = null;
        }
    }

}

使用它的工作XML:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/root"
    android:focusable="true"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:keepScreenOn="true">

    <ua.polohalo.zoomabletextureview.ZoomableTextureView
        android:id="@+id/video_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="top"
        app:maxScale="4"
        app:minScale="1"/>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Does This work?"
        android:textColor="@android:color/holo_red_dark"
        app:layout_constraintBottom_toBottomOf="parent" />

</android.support.constraint.ConstraintLayout>

0 个答案:

没有答案
相关问题