在没有 SurfaceView 的情况下使用 Exoplayer [英] Using Exoplayer without SurfaceView

查看:38
本文介绍了在没有 SurfaceView 的情况下使用 Exoplayer的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想像 Spotify 那样在服务中使用 Exoplayer,但我可以看到大多数实现都使用 SurfaceView 和 VideoController.Exoplyer 是否可以在没有这两个组件的情况下使用,以便它可以在一个服务中工作?

I want to use Exoplayer in a service the way Spotify does but i can see that most of the implementations use a SurfaceView and a VideoController. Can the Exoplyer be used without these two components so that it can work in a service?

推荐答案

我已经创建了一个可以播放您的音频的服务,它类似于官方 exoplayer 的演示.exoplayer github

I have created a service that can play your audio it is similar to the demo of official exoplayer. exoplayer github

我创建了一个类似于官方演示的 PlayerActivity 的 PlayerService.我仅使用 MISC 部分中的 Google play(MP3 音频)选项进行了测试.请不要评论它所尝试的代码风格.

I have created a PlayerService just similar to PlayerActivity of the official demo. I have tested only with the option Google play (MP3 Audio) in MISC section. Please do not comment on the code style it is done to try this out.

public class PlayService extends Service implements
    DemoPlayer.Listener, AudioCapabilitiesReceiver.Listener,
    DemoPlayer.CaptionListener, DemoPlayer.Id3MetadataListener {



// For use within demo app code.
public static final String CONTENT_ID_EXTRA = "content_id";
public static final String CONTENT_TYPE_EXTRA = "content_type";
public static final String PROVIDER_EXTRA = "provider";


private DemoPlayer player;


// For use when launching the demo app using adb.
private static final String CONTENT_EXT_EXTRA = "type";
private static final String TAG = "PlayerService";
private static final int MENU_GROUP_TRACKS = 1;
private static final int ID_OFFSET = 2;


private EventLogger eventLogger;
private MediaController mediaController;
private long playerPosition;
private boolean enableBackgroundAudio;

private Uri contentUri;
private int contentType;
private String contentId;
private String provider;

private AudioCapabilitiesReceiver audioCapabilitiesReceiver;
private boolean playerNeedsPrepare;

public PlayService() {
}

@Override
public IBinder onBind(Intent intent) {
    // TODO: Return the communication channel to the service.
    throw new UnsupportedOperationException("Not yet implemented");
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    audioCapabilitiesReceiver = new AudioCapabilitiesReceiver(this, this);
    audioCapabilitiesReceiver.register();

    contentUri = intent.getData();
    contentType = intent.getIntExtra(CONTENT_TYPE_EXTRA,
            inferContentType(contentUri, intent.getStringExtra(CONTENT_EXT_EXTRA)));
    contentId = intent.getStringExtra(CONTENT_ID_EXTRA);
    provider = intent.getStringExtra(PROVIDER_EXTRA);

    preparePlayer(true);


    return START_STICKY;
}


private static int inferContentType(Uri uri, String fileExtension) {
    String lastPathSegment = !TextUtils.isEmpty(fileExtension) ? "." + fileExtension
            : uri.getLastPathSegment();
    return Util.inferContentType(lastPathSegment);
}

@Override
public void onStateChanged(boolean playWhenReady, int playbackState) {

}

@Override
public void onError(Exception e) {

}

@Override
public void onVideoSizeChanged(int width, int height, int unappliedRotationDegrees, float pixelWidthHeightRatio) {

}


private void releasePlayer() {
    if (player != null) {
        playerPosition = player.getCurrentPosition();
        player.release();
        player = null;
        eventLogger.endSession();
        eventLogger = null;
    }
}

private DemoPlayer.RendererBuilder getRendererBuilder() {
    String userAgent = Util.getUserAgent(this, "ExoPlayerDemo");
    switch (contentType) {
        case Util.TYPE_SS:
            return new SmoothStreamingRendererBuilder(this, userAgent, contentUri.toString(),
                    new SmoothStreamingTestMediaDrmCallback());
        case Util.TYPE_DASH:
            return new DashRendererBuilder(this, userAgent, contentUri.toString(),
                    new WidevineTestMediaDrmCallback(contentId, provider));
        case Util.TYPE_HLS:
            return new HlsRendererBuilder(this, userAgent, contentUri.toString());
        case Util.TYPE_OTHER:
            return new ExtractorRendererBuilder(this, userAgent, contentUri);
        default:
            throw new IllegalStateException("Unsupported type: " + contentType);
    }
}

private void preparePlayer(boolean playWhenReady) {
    if (player == null) {
        player = new DemoPlayer(getRendererBuilder());
        player.setBackgrounded(true);
        player.addListener(this);
        player.setCaptionListener(this);
        player.setMetadataListener(this);
        player.seekTo(playerPosition);
        playerNeedsPrepare = true;
        //mediaController.setMediaPlayer(player.getPlayerControl());
        //mediaController.setEnabled(true);
        eventLogger = new EventLogger();
        eventLogger.startSession();
        player.addListener(eventLogger);
        player.setInfoListener(eventLogger);
        player.setInternalErrorListener(eventLogger);
    }
    player.setBackgrounded(true);
    if (playerNeedsPrepare) {
        player.prepare();
        playerNeedsPrepare = false;
    }
    player.setBackgrounded(true);
    player.setPlayWhenReady(playWhenReady);
}

@Override
public void onAudioCapabilitiesChanged(AudioCapabilities audioCapabilities) {
    if (player == null) {
        return;
    }
    boolean backgrounded = player.getBackgrounded();
    boolean playWhenReady = player.getPlayWhenReady();
    releasePlayer();
    preparePlayer(playWhenReady);
    player.setBackgrounded(backgrounded);
}

@Override
public void onCues(List<Cue> cues) {

}

@Override
public void onId3Metadata(List<Id3Frame> id3Frames) {
    for (Id3Frame id3Frame : id3Frames) {
        if (id3Frame instanceof TxxxFrame) {
            TxxxFrame txxxFrame = (TxxxFrame) id3Frame;
            Log.i(TAG, String.format("ID3 TimedMetadata %s: description=%s, value=%s", txxxFrame.id,
                    txxxFrame.description, txxxFrame.value));
        } else if (id3Frame instanceof PrivFrame) {
            PrivFrame privFrame = (PrivFrame) id3Frame;
            Log.i(TAG, String.format("ID3 TimedMetadata %s: owner=%s", privFrame.id, privFrame.owner));
        } else if (id3Frame instanceof GeobFrame) {
            GeobFrame geobFrame = (GeobFrame) id3Frame;
            Log.i(TAG, String.format("ID3 TimedMetadata %s: mimeType=%s, filename=%s, description=%s",
                    geobFrame.id, geobFrame.mimeType, geobFrame.filename, geobFrame.description));
        } else {
            Log.i(TAG, String.format("ID3 TimedMetadata %s", id3Frame.id));
        }
    }
}

}

这篇关于在没有 SurfaceView 的情况下使用 Exoplayer的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆