Java 即使PlayerView已暂停,Exoplayer也会播放音频

Java 即使PlayerView已暂停,Exoplayer也会播放音频,java,android,android-studio,exoplayer,Java,Android,Android Studio,Exoplayer,我正在创建一个Exoplayer视频播放器,它播放一个mp4文件,其中包含来自url的视频和音频。视频和音频播放正常,但当视频播放器暂停时,音频仍在播放。我不知道该怎么解决这个问题。我假设问题是由于我的android设备引起的。我在下面留下了我的代码、应用程序信息、android设备信息和我的问题视频剪辑。如果有人能使用我的代码并告诉我他们是否遇到了同样的问题,那将非常感谢。请帮帮我 应用程序的详细信息: 使用API 21:Android 5.0(棒棒糖)。包含Internet权限。导入实现'c

我正在创建一个
Exoplayer
视频播放器,它播放一个
mp4
文件,其中包含来自url的视频和音频。视频和音频播放正常,但当视频播放器暂停时,音频仍在播放。我不知道该怎么解决这个问题。我假设问题是由于我的android设备引起的。我在下面留下了我的代码、应用程序信息、android设备信息和我的问题视频剪辑。如果有人能使用我的代码并告诉我他们是否遇到了同样的问题,那将非常感谢。请帮帮我

应用程序的详细信息:

使用API 21:Android 5.0(棒棒糖)。包含Internet权限。导入
实现'com.google.android.exoplayer:exoplayer:2.8.1'

设备详细信息:

类型:安卓平板电脑。安卓版本:5.1.1

MainActivity.java

import android.content.pm.ActivityInfo;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;

import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.ExoPlayerFactory;
import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.SimpleExoPlayer;
import com.google.android.exoplayer2.source.ConcatenatingMediaSource;
import com.google.android.exoplayer2.source.ExtractorMediaSource;
import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.source.MergingMediaSource;
import com.google.android.exoplayer2.source.SingleSampleMediaSource;
import com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
import com.google.android.exoplayer2.trackselection.TrackSelection;
import com.google.android.exoplayer2.ui.PlayerView;
import com.google.android.exoplayer2.upstream.DataSource;
import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter;
import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory;
import com.google.android.exoplayer2.util.MimeTypes;
import com.google.android.exoplayer2.util.Util;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity
{
    SimpleExoPlayer video_player;
    PlayerView player_screen;
    DefaultTrackSelector track_selector;
    DefaultBandwidthMeter band_width_meter = new DefaultBandwidthMeter();
    MediaSource mediaSource_both;

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

        player_screen = findViewById (R.id.player_screen);
        player_screen.requestFocus();

        TrackSelection.Factory video_track_selection_factory = new AdaptiveTrackSelection.Factory(band_width_meter);
        track_selector = new DefaultTrackSelector(video_track_selection_factory);
        video_player = ExoPlayerFactory.newSimpleInstance(this, track_selector);

        player_screen.setPlayer(video_player);
        video_player.setPlayWhenReady(true);

        DataSource.Factory data_source_factory = new DefaultDataSourceFactory(this, Util.getUserAgent(this, "Application Name"), new DefaultBandwidthMeter());
        Uri url = Uri.parse("http://dash.akamaized.net/akamai/bbb/bbb_1280x720_60fps_6000k.mp4");
        mediaSource_both = new ExtractorMediaSource.Factory(data_source_factory).createMediaSource(url);

        video_player.prepare(mediaSource_both);
    }
}
活动\u main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <com.google.android.exoplayer2.ui.PlayerView
        android:id="@+id/player_screen"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_gravity="center"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:use_controller="true" />

</android.support.constraint.ConstraintLayout>


我制作了一个非常简单的示例应用程序来重现这个问题

但我也看到了播放器和视频都没有问题

代码如下:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    SimpleExoPlayerView simpleExoPlayerView = findViewById(R.id.player_view);

    SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance(this, new DefaultTrackSelector(new DefaultBandwidthMeter.Builder().build()));

    SimpleCache downloadCache = new SimpleCache(new File(getCacheDir(), "exoCache"), new NoOpCacheEvictor());

    String uri = "http://dash.akamaized.net/akamai/bbb/bbb_1280x720_60fps_6000k.mp4";

    DataSource.Factory dataSourceFactory = new CacheDataSourceFactory(downloadCache, new DefaultDataSourceFactory(this, "seyed"));

    MediaSource mediaSource = new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(Uri.parse(uri));

    player.addListener(new Player.EventListener() {
        @Override
        public void onTimelineChanged(Timeline timeline, Object manifest, int reason) {
            Log.d("exo", "timeLine Changed");
        }

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

        }

        @Override
        public void onLoadingChanged(boolean isLoading) {
            Log.d("exo", "loding changed= " + isLoading);
        }

        @Override
        public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
            Log.d("exo", "state changed");
        }

        @Override
        public void onRepeatModeChanged(int repeatMode) {

        }

        @Override
        public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) {

        }

        @Override
        public void onPlayerError(ExoPlaybackException error) {
            Log.e("exo", "exoplayer error", error);
        }

        @Override
        public void onPositionDiscontinuity(int reason) {

        }

        @Override
        public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {

        }

        @Override
        public void onSeekProcessed() {
            Log.d("exo", "seek processed");
        }
    });
    player.prepare(mediaSource);

    simpleExoPlayerView.setPlayer(player);

    player.setPlayWhenReady(true);

}
布局如下:

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/AppTheme.PopupOverlay" />

</android.support.design.widget.AppBarLayout>

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context=".MainActivity"
    tools:showIn="@layout/activity_main">

    <com.google.android.exoplayer2.ui.SimpleExoPlayerView
        android:id="@+id/player_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</android.support.constraint.ConstraintLayout>
2018年18月17日更新 实际上,您面临的问题是因为
这个.setRequestedOrientation(ActivityInfo.SCREEN\u ORIENTATION\u LANDSCAPE)

当您运行活动时,它以纵向模式启动,一切正常(没有
此.setRequestedOrientation(ActivityInfo.SCREEN\u ORIENTATION\u横向);
),创建一个exoplayer并开始播放

但当您在活动启动期间更改方向时。android试图破坏该活动并创建另一个活动您的问题来了: 第一个活动不会被销毁,因为您忘记了在
ondestory()
中重新启用ExoPlayer,并且当创建新活动时,也会创建一个新的ExoPlayer,这两个活动都会继续播放。暂停播放时,实际上是暂停第二个播放,而不是第一个播放。这种行为称为内存泄漏

首先,确保在活动的
ondestory()
中调用
.release()

对于方向,您有两个选项:

1.在清单中指定活动的方向,以便android在创建活动之前应用它

 <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:theme="@style/AppTheme.NoActionBar"
        android:screenOrientation="sensorLandscape">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

这是仪表板媒体吗?或simple.mp4它是一个简单的
.mp4
文件,包含视频和音频曲目。你遇到同样的问题了吗?我试着复制一下,看看会发生什么。谢谢我会等待你的答复。如果它是完全有用的,请考虑接受一个答案或肯定,我稍后会投票,并接受答案。我想我没有正确地问这个问题。我只是想有人复制并粘贴我的代码,然后在设备上试用,告诉我他们是否遇到了我遇到的问题。我遇到的问题是,当视频播放器暂停时,视频停止,但音频仍在后台播放。不过谢谢你重新编写代码。但如果您能使用我的代码,让我知道即使视频播放器暂停,音频仍在播放,这将非常有用。谢谢。我已经在视频中记录了我的问题,并在上面的问题中上传了。哦,好的,我看到了你的视频。虽然我的代码与你的代码非常相似,但我会将其更改为与你的代码完全相同。只有一件有趣的事要问:你是否处理了方向的改变?我也能看看你的舱单吗?谢谢。问题现在已经解决了。
dependencies {
implementation 'com.android.support:appcompat-v7:27.0.2'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
implementation 'com.android.support:design:27.0.2'
implementation 'com.google.android.exoplayer:exoplayer:2.8.2'
}
 <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:theme="@style/AppTheme.NoActionBar"
        android:screenOrientation="sensorLandscape">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
<activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:theme="@style/AppTheme.NoActionBar"
        android:configChanges="orientation">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>