无法通过最新版本的Android中的ExoPlayer流式传输音频文件。

huangapple go评论64阅读模式
英文:

Unable to stream Audio file through exoplayer in latest version Android

问题

I am using exoplayer to stream my Audio files from Firebase storage to my app. I used Media player earlier which was so slow. So I changed to exoplayer and its version was 2.8.4 at that time.

Here's the Code i used to stream Audio:

SimpleExoPlayer simpleExoPlayer;
private void SetupPlayer(){
    DefaultRenderersFactory renderersFactory = new DefaultRenderersFactory(this,
            null,DefaultRenderersFactory.EXTENSION_RENDERER_MODE_OFF);
    TrackSelector trackSelector = new DefaultTrackSelector();
    LoadControl loadControl = new DefaultLoadControl.Builder()
            .setAllocator(new DefaultAllocator(true, 16))
            .setBufferDurationsMs(MIN_BUFFER_DURATION,
                    MAX_BUFFER_DURATION,
                    MIN_PLAYBACK_START_BUFFER,
                    MIN_PLAYBACK_RESUME_BUFFER)
            .setTargetBufferBytes(-1)
            .setPrioritizeTimeOverSizeThresholds(true).createDefaultLoadControl();
    simpleExoPlayer = ExoPlayerFactory.newSimpleInstance(renderersFactory,trackSelector,loadControl);
    String userAgent = Util.getUserAgent(this, "Play Audio");
    ExtractorMediaSource mediaSource = new ExtractorMediaSource(Uri.parse(audio_url),new DefaultDataSourceFactory(this, userAgent),
            new DefaultExtractorsFactory(),null,null);

    simpleExoPlayer.prepare(mediaSource);
}

It worked great. But now exoplayer has updated its version to 2.11.8. In this version, ExtractorMediaSource, DefaultRenderersFactory, DefaultTrackSelector, ExoPlayerFactory are deprecated.

So I changed my code for the recent version.

Here's the Code:

SimpleExoPlayer simpleExoPlayer;
private void SetupPlayer(){
   // Create a data source factory.
    DataSource.Factory dataSourceFactory =
            new DefaultHttpDataSourceFactory(Util.getUserAgent(this
                    , "app-name"));
// Create a progressive media source pointing to a stream uri.
    MediaSource mediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory)
            .createMediaSource(Uri.parse(audio_url));
// Create a player instance.
    simpleExoPlayer =  new SimpleExoPlayer.Builder(this).build();
// Prepare the player with the media source.
    simpleExoPlayer.prepare(mediaSource);
}

Now it is showing error:

java.lang.NoSuchMethodError: No static method metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; in class Ljava/lang/invoke/LambdaMetafactory; or its super classes (declaration of 'java.lang.invoke.LambdaMetafactory' appears in /apex/com.android.runtime/javalib/core-oj.jar)
        at com.google.android.exoplayer2.util.SlidingPercentile.<clinit>(SlidingPercentile.java:38)
        at com.google.android.exoplayer2.upstream.DefaultBandwidthMeter.<init>(DefaultBandwidthMeter.java:276)
        at com.google.android.exoplayer2.upstream.DefaultBandwidthMeter.<init>(DefaultBandwidthMeter.java:48)
        at com.google.android.exoplayer2.upstream.DefaultBandwidthMeter$Builder.build(DefaultBandwidthMeter.java:190)
        at com.google.android.exoplayer2.upstream.DefaultBandwidthMeter.getSingletonInstance(DefaultBandwidthMeter.java:229)
        at com.google.android.exoplayer2.SimpleExoPlayer$Builder.<init>(SimpleExoPlayer.java:144)
        at com.google.android.exoplayer2.SimpleExoPlayer$Builder.<init>(SimpleExoPlayer.java:126)
        at com.paulstevenme.jeevaoli.StoryAudioActivity.SetupPlayer(StoryAudioActivity.java:323)
        at com.paulstevenme.jeevaoli.StoryAudioActivity.onCreate(StoryAudioActivity.java:125)
        at android.app.Activity.performCreate(Activity.java:7955)
        at android.app.Activity.performCreate(Activity.java:7944)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1307)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3423)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3595)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2147)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:237)
        at android.app.ActivityThread.main(ActivityThread.java:7814)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1068)

I searched Stack overflow. But everyone answers are deprecated ones. So I don't know how to fix it. Please help me with some solutions.

英文:

I am using exoplayer to stream my Audio files from Firebase storage to my app. I used Media player earlier which was so slow. So I changed to exoplayer and its version was 2.8.4 at that time.

Here's the Code i used to stream Audio:

SimpleExoPlayer simpleExoPlayer;
private void SetupPlayer(){
DefaultRenderersFactory renderersFactory = new DefaultRenderersFactory(this,
null,DefaultRenderersFactory.EXTENSION_RENDERER_MODE_OFF);
TrackSelector trackSelector = new DefaultTrackSelector();
LoadControl loadControl = new DefaultLoadControl.Builder()
.setAllocator(new DefaultAllocator(true, 16))
.setBufferDurationsMs(MIN_BUFFER_DURATION,
MAX_BUFFER_DURATION,
MIN_PLAYBACK_START_BUFFER,
MIN_PLAYBACK_RESUME_BUFFER)
.setTargetBufferBytes(-1)
.setPrioritizeTimeOverSizeThresholds(true).createDefaultLoadControl();
simpleExoPlayer = ExoPlayerFactory.newSimpleInstance(renderersFactory,trackSelector,loadControl);
String userAgent = Util.getUserAgent(this, &quot;Play Audio&quot;);
ExtractorMediaSource mediaSource = new ExtractorMediaSource(Uri.parse(audio_url),new DefaultDataSourceFactory(this, userAgent),
new DefaultExtractorsFactory(),null,null);
simpleExoPlayer.prepare(mediaSource);
}

It worked great. But now exoplayer has updated its version to 2.11.8. In this version, ExtractorMediaSource, DefaultRenderersFactory, DefaultTrackSelector, ExoPlayerFactory are deprecated.

So I changed my code for the recent version.

Here's the Code:

    SimpleExoPlayer simpleExoPlayer;
private void SetupPlayer(){
// Create a data source factory.
DataSource.Factory dataSourceFactory =
new DefaultHttpDataSourceFactory(Util.getUserAgent(this
, &quot;app-name&quot;));
// Create a progressive media source pointing to a stream uri.
MediaSource mediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory)
.createMediaSource(Uri.parse(audio_url));
// Create a player instance.
simpleExoPlayer =  new SimpleExoPlayer.Builder(this).build();
// Prepare the player with the media source.
simpleExoPlayer.prepare(mediaSource);
}

Now it is showing error

java.lang.NoSuchMethodError: No static method metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; in class Ljava/lang/invoke/LambdaMetafactory; or its super classes (declaration of &#39;java.lang.invoke.LambdaMetafactory&#39; appears in /apex/com.android.runtime/javalib/core-oj.jar)
at com.google.android.exoplayer2.util.SlidingPercentile.&lt;clinit&gt;(SlidingPercentile.java:38)
at com.google.android.exoplayer2.upstream.DefaultBandwidthMeter.&lt;init&gt;(DefaultBandwidthMeter.java:276)
at com.google.android.exoplayer2.upstream.DefaultBandwidthMeter.&lt;init&gt;(DefaultBandwidthMeter.java:48)
at com.google.android.exoplayer2.upstream.DefaultBandwidthMeter$Builder.build(DefaultBandwidthMeter.java:190)
at com.google.android.exoplayer2.upstream.DefaultBandwidthMeter.getSingletonInstance(DefaultBandwidthMeter.java:229)
at com.google.android.exoplayer2.SimpleExoPlayer$Builder.&lt;init&gt;(SimpleExoPlayer.java:144)
at com.google.android.exoplayer2.SimpleExoPlayer$Builder.&lt;init&gt;(SimpleExoPlayer.java:126)
at com.paulstevenme.jeevaoli.StoryAudioActivity.SetupPlayer(StoryAudioActivity.java:323)
at com.paulstevenme.jeevaoli.StoryAudioActivity.onCreate(StoryAudioActivity.java:125)
at android.app.Activity.performCreate(Activity.java:7955)
at android.app.Activity.performCreate(Activity.java:7944)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1307)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3423)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3595)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2147)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:237)
at android.app.ActivityThread.main(ActivityThread.java:7814)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1068)

I searched Stack overflow. But everyone answers are deprecated ones. So I don't know how to fix it. Please help me with some solutions.

答案1

得分: 1

找到答案了。我只是忘记在build gradle中添加编译选项。添加后,它就正常工作了。

compileOptions {
    targetCompatibility JavaVersion.VERSION_1_8
}
英文:

Found the Answer. I just missed adding compile options in build gradle. After Adding, it worked.

compileOptions {
targetCompatibility JavaVersion.VERSION_1_8
}

huangapple
  • 本文由 发表于 2020年8月28日 00:22:03
  • 转载请务必保留本文链接:https://go.coder-hub.com/63620264.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定