首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >谷歌ExoPlayer指南

谷歌ExoPlayer指南
EN

Stack Overflow用户
提问于 2017-01-25 09:49:44
回答 2查看 6.8K关注 0票数 3

我正努力用ExoPlayer构建基本的应用程序。

你好,好吧,我对“开始”部分有意见。不知道需要使用什么来播放视频或流。怎么停,玩,停..。另一个问题是,我不知道我提供了什么,例如,在DefaultDataSourceFactory构造函数中,为什么,我得到了什么与没有一些参数.我对整个用法很困惑..。请帮帮忙!谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-27 06:20:36

首先,您需要将其添加到您的build.gradle中

'com.google.android.exoplayer:exoplayer:r2.1.1'编译

1.布局文件

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <com.google.android.exoplayer2.ui.SimpleExoPlayerView
        android:id="@+id/player_view"
        android:focusable="true"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</RelativeLayout>

2.类文件

代码语言:javascript
运行
复制
public class ExoPlayerActivity extends AppCompatActivity implements ExoPlayer.EventListener {
        SimpleExoPlayer player;
        String path;        // it can be url of video for online streaming or a url of local video

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

            // set your path here
            path=<your path>;

            // 1. Create a default TrackSelector
            BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
            TrackSelection.Factory videoTrackSelectionFactory =
                    new AdaptiveVideoTrackSelection.Factory(bandwidthMeter);
            TrackSelector trackSelector =
                    new DefaultTrackSelector(videoTrackSelectionFactory);

            // 2. Create a default LoadControl
            LoadControl loadControl = new DefaultLoadControl();
            // 3. Create the player
            player = ExoPlayerFactory.newSimpleInstance(this, trackSelector, loadControl);

            SimpleExoPlayerView playerView = (SimpleExoPlayerView) findViewById(R.id.player_view);
            playerView.setPlayer(player);
            playerView.setKeepScreenOn(true);
            // Produces DataSource instances through which media data is loaded.
            DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(this, Util.getUserAgent(this, "ExoPlayer"));

            // Produces Extractor instances for parsing the media data.
            ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();

            // This is the MediaSource representing the media to be played.
            MediaSource videoSource = new ExtractorMediaSource(Uri.parse(path),
                    dataSourceFactory, extractorsFactory, null, null);
            // Prepare the player with the source.
            player.addListener(this);
            player.prepare(videoSource);
            playerView.requestFocus();
            player.setPlayWhenReady(true);      // to play video when ready. Use false to pause a video
        }


        @Override
        protected void onPause() {
            super.onPause();
            if (player != null) {
                player.setPlayWhenReady(false); //to pause a video because now our video player is not in focus
            }
        }

        @Override
        public void onTimelineChanged(Timeline timeline, Object manifest) {

        }

        @Override
        public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {

        }

        @Override
        public void onLoadingChanged(boolean isLoading) {

        }

        @Override
        public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
            switch (playbackState) {
                case ExoPlayer.STATE_BUFFERING:
                    //You can use progress dialog to show user that video is preparing or buffering so please wait
                    break;
                case ExoPlayer.STATE_IDLE:
                    //idle state
                    break;
                case ExoPlayer.STATE_READY:
                    // dismiss your dialog here because our video is ready to play now
                    break;
                case ExoPlayer.STATE_ENDED:
                    // do your processing after ending of video
                    break;
            }
        }

        @Override
        public void onPlayerError(ExoPlaybackException error) {
            // show user that something went wrong. I am showing dialog but you can use your way
            AlertDialog.Builder adb = new AlertDialog.Builder(ExoPlayerActivity.this);
            adb.setTitle("Could not able to stream video");
            adb.setMessage("It seems that something is going wrong.\nPlease try again.");
            adb.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                    finish(); // take out user from this activity. you can skip this
                }
            });
            AlertDialog ad = adb.create();
            ad.show();
        }

        @Override
        public void onPositionDiscontinuity() {
            //Video is not streaming properly
            Log.d("Mayur", "Discontinuity");
        }

        @Override
        protected void onDestroy() {
            super.onDestroy();
            player.release();   //it is important to release a player
        }
    }

我想这对初学者来说已经足够了。还要记住,这个库的标准音频和视频组件依赖于Android4.1中发布的MediaCodec API (API 16)。所以它不能在Android4.0和更低的版本上工作。

票数 23
EN

Stack Overflow用户

发布于 2022-07-04 18:19:06

最近的用法如下:

Step-1build.gradle中添加的依赖项

implementation 'com.google.android.exoplayer:exoplayer:2.18.0'

Step-2activity_main.xml文件编辑。

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:argType="http://schemas.android.com/tools"
    android:id="@+id/flRoot"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:focusable="true"
    android:keepScreenOn="true">

    <com.google.android.exoplayer2.ui.StyledPlayerView
        android:id="@+id/playerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:show_subtitle_button="true"
        argType:fastforward_increment="15000"
        argType:resize_mode="fixed_width"
        argType:rewind_increment="15000"
        argType:show_buffering="when_playing"
        argType:show_fastforward_button="true"
        argType:show_next_button="false"
        argType:show_previous_button="false"
        argType:show_rewind_button="true"
        argType:show_subtitle_button="true"
        argType:use_artwork="true"
        argType:use_controller="true"
        argType:use_sensor_rotation="true">
    </com.google.android.exoplayer2.ui.StyledPlayerView>

</FrameLayout>

Step-3MainActivity.kt中的ExoPlayer调整

代码语言:javascript
运行
复制
class MainActivity : Activity() {

    private lateinit var binding: ActivityMainBinding
    private var exoPlayer: ExoPlayer? = null
    private var playbackPosition = 0L
    private var playWhenReady = true

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)
        preparePlayer()
    }

    private fun preparePlayer() {
        exoPlayer = ExoPlayer.Builder(this).build()
        exoPlayer?.playWhenReady = true
        binding.playerView.player = exoPlayer
        val defaultHttpDataSourceFactory = DefaultHttpDataSource.Factory()
        val mediaItem =
            MediaItem.fromUri(URL)
        val mediaSource =
            HlsMediaSource.Factory(defaultHttpDataSourceFactory).createMediaSource(mediaItem)
        exoPlayer?.setMediaSource(mediaSource)
        exoPlayer?.seekTo(playbackPosition)
        exoPlayer?.playWhenReady = playWhenReady
        exoPlayer?.prepare()
    }

    private fun releasePlayer() {
        exoPlayer?.let { player ->
            playbackPosition = player.currentPosition
            playWhenReady = player.playWhenReady
            player.release()
            exoPlayer = null
        }
    }

    override fun onStop() {
        super.onStop()
        releasePlayer()
    }

    override fun onPause() {
        super.onPause()
        releasePlayer()
    }

    override fun onDestroy() {
        super.onDestroy()
        releasePlayer()
    }

    companion object {
        const val URL =
            "https://bitdash-a.akamaihd.net/content/sintel/hls/playlist.m3u8"
    }
}

您可以访问GitHubhttps://github.com/halilozel1903/ExoPlayerDemo上的项目

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41848293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档