我正努力用ExoPlayer构建基本的应用程序。
你好,好吧,我对“开始”部分有意见。不知道需要使用什么来播放视频或流。怎么停,玩,停..。另一个问题是,我不知道我提供了什么,例如,在DefaultDataSourceFactory构造函数中,为什么,我得到了什么与没有一些参数.我对整个用法很困惑..。请帮帮忙!谢谢!
发布于 2017-01-27 06:20:36
首先,您需要将其添加到您的build.gradle中
'com.google.android.exoplayer:exoplayer:r2.1.1'编译
1.布局文件
<?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.类文件
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和更低的版本上工作。
发布于 2022-07-04 18:19:06
最近的用法如下:
Step-1:build.gradle
中添加的依赖项
implementation 'com.google.android.exoplayer:exoplayer:2.18.0'
Step-2:activity_main.xml
文件编辑。
<?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-3:MainActivity.kt
中的ExoPlayer
调整
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"
}
}
您可以访问GitHub
:https://github.com/halilozel1903/ExoPlayerDemo上的项目
https://stackoverflow.com/questions/41848293
复制相似问题