Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android ExoPlayer stream mp3 over HTTP

I'm trying to get a grasp on the new ExoPlayer library introduced this year at Google I/O 2014 so that I can incorporate it into my application.

I'm attempting to stream an mp3 over HTTP, but so far have been unsuccessful. I'm not sure if it's possible, but I'm trying to accomplish this without extending any of the base Source/Sample classes. My code is as follows:

In my Activity

SampleSource s = new FrameworkSampleSource(this, Uri.parse("http://traffic.libsyn.com/joeroganexp/p518.mp3"), null, 1);

// Since I only have 1 audio renderer
ExoPlayer player = ExoPlayer.Factory.newInstance(1);

MediaCodecAudioTrackRenderer audioRenderer = new MediaCodecAudioTrackRenderer(s);
player.prepare(audioRenderer);
player.setPlayWhenReady(true);

Logcat

3363-3376/com.kevintcoughlin.smodr V/FFmpegExtractor﹕ SniffFFMPEG
07-06 15:52:34.080    3363-3376/com.kevintcoughlin.smodr I/FFmpegExtractor﹕ android-source:0xb7c53e00
07-06 15:52:34.084    3363-3376/com.kevintcoughlin.smodr D/FFMPEG﹕ android source begin open
07-06 15:52:34.084    3363-3376/com.kevintcoughlin.smodr D/FFMPEG﹕ android open, url: android-source:0xb7c53e00
07-06 15:52:34.084    3363-3376/com.kevintcoughlin.smodr D/FFMPEG﹕ ffmpeg open android data source success, source ptr: 0xb7c53e00
07-06 15:52:34.088    3363-3376/com.kevintcoughlin.smodr D/FFMPEG﹕ android source open success
07-06 15:52:34.108    3363-3363/com.kevintcoughlin.smodr W/EGL_genymotion﹕ eglSurfaceAttrib not implemented
07-06 15:52:34.116    3363-3363/com.kevintcoughlin.smodr E/OpenGLRenderer﹕ Getting MAX_TEXTURE_SIZE from GradienCache
07-06 15:52:34.120    3363-3363/com.kevintcoughlin.smodr E/OpenGLRenderer﹕ MAX_TEXTURE_SIZE: 16384
07-06 15:52:34.128    3363-3363/com.kevintcoughlin.smodr E/OpenGLRenderer﹕ Getting MAX_TEXTURE_SIZE from Caches::initConstraints()
07-06 15:52:34.128    3363-3363/com.kevintcoughlin.smodr E/OpenGLRenderer﹕ MAX_TEXTURE_SIZE: 16384
07-06 15:52:34.128    3363-3363/com.kevintcoughlin.smodr D/OpenGLRenderer﹕ Enabling debug mode 0
07-06 15:52:34.640    3363-3376/com.kevintcoughlin.smodr I/FFMPEG﹕ [mp3 @ 0xb7c57040] Estimating duration from bitrate, this may be inaccurate
07-06 15:52:34.640    3363-3376/com.kevintcoughlin.smodr I/FFMPEG﹕ Input #0, mp3, from 'android-source:0xb7c53e00':
07-06 15:52:34.640    3363-3376/com.kevintcoughlin.smodr I/FFMPEG﹕ Metadata:
07-06 15:52:34.640    3363-3376/com.kevintcoughlin.smodr I/FFMPEG﹕ TSS             : Logic Pro 9.1.8
07-06 15:52:34.644    3363-3376/com.kevintcoughlin.smodr I/FFMPEG﹕ title           : #518 - Matt Fulchiron
07-06 15:52:34.644    3363-3376/com.kevintcoughlin.smodr I/FFMPEG﹕ artist          : Joe Rogan Experience
07-06 15:52:34.644    3363-3376/com.kevintcoughlin.smodr I/FFMPEG﹕ album_artist    : Joe Rogan Experience
07-06 15:52:34.644    3363-3376/com.kevintcoughlin.smodr I/FFMPEG﹕ Duration: 02:57:10.21, start: 0.000000, bitrate: 127 kb/s
07-06 15:52:34.644    3363-3376/com.kevintcoughlin.smodr I/FFMPEG﹕ Stream #0:0: Audio: mp3, 44100 Hz, stereo, s16p, 128 kb/s
07-06 15:52:34.644    3363-3376/com.kevintcoughlin.smodr I/FFmpegExtractor﹕ FFmpegExtrator, url: android-source:0xb7c53e00, format_name: mp3, format_long_name: MP2/3 (MPEG audio layer 2/3)
07-06 15:52:34.644    3363-3376/com.kevintcoughlin.smodr I/FFmpegExtractor﹕ list the formats suppoted by ffmpeg:
07-06 15:52:34.644    3363-3376/com.kevintcoughlin.smodr I/FFmpegExtractor﹕ ========================================
07-06 15:52:34.644    3363-3376/com.kevintcoughlin.smodr V/FFmpegExtractor﹕ format_names[00]: mpeg
07-06 15:52:34.644    3363-3376/com.kevintcoughlin.smodr V/FFmpegExtractor﹕ format_names[01]: mpegts
07-06 15:52:34.644    3363-3376/com.kevintcoughlin.smodr V/FFmpegExtractor﹕ format_names[02]: mov,mp4,m4a,3gp,3g2,mj2
07-06 15:52:34.644    3363-3376/com.kevintcoughlin.smodr V/FFmpegExtractor﹕ format_names[03]: matroska,webm
07-06 15:52:34.644    3363-3376/com.kevintcoughlin.smodr V/FFmpegExtractor﹕ format_names[04]: asf
07-06 15:52:34.644    3363-3376/com.kevintcoughlin.smodr V/FFmpegExtractor﹕ format_names[05]: rm
07-06 15:52:34.644    3363-3376/com.kevintcoughlin.smodr V/FFmpegExtractor﹕ format_names[06]: flv
07-06 15:52:34.644    3363-3376/com.kevintcoughlin.smodr V/FFmpegExtractor﹕ format_names[07]: swf
07-06 15:52:34.644    3363-3376/com.kevintcoughlin.smodr V/FFmpegExtractor﹕ format_names[08]: avi
07-06 15:52:34.644    3363-3376/com.kevintcoughlin.smodr V/FFmpegExtractor﹕ format_names[09]: ape
07-06 15:52:34.644    3363-3376/com.kevintcoughlin.smodr V/FFmpegExtractor﹕ format_names[10]: dts
07-06 15:52:34.644    3363-3376/com.kevintcoughlin.smodr V/FFmpegExtractor﹕ format_names[11]: flac
07-06 15:52:34.644    3363-3376/com.kevintcoughlin.smodr V/FFmpegExtractor﹕ format_names[12]: ac3
07-06 15:52:34.644    3363-3376/com.kevintcoughlin.smodr V/FFmpegExtractor﹕ format_names[13]: wav
07-06 15:52:34.644    3363-3376/com.kevintcoughlin.smodr V/FFmpegExtractor﹕ format_names[14]: ogg
07-06 15:52:34.644    3363-3376/com.kevintcoughlin.smodr V/FFmpegExtractor﹕ format_names[15]: vc1
07-06 15:52:34.644    3363-3376/com.kevintcoughlin.smodr V/FFmpegExtractor﹕ format_names[16]: hevc
07-06 15:52:34.644    3363-3376/com.kevintcoughlin.smodr I/FFmpegExtractor﹕ ========================================
07-06 15:52:34.644    3363-3376/com.kevintcoughlin.smodr D/FFMPEG﹕ android source close
07-06 15:52:34.644    3363-3376/com.kevintcoughlin.smodr W/FFmpegExtractor﹕ sniff through BetterSniffFFMPEG failed, try LegacySniffFFMPEG
07-06 15:52:34.644    3363-3376/com.kevintcoughlin.smodr I/FFmpegExtractor﹕ source url:http://traffic.libsyn.com/joeroganexp/p518.mp3
07-06 15:52:34.644    3363-3376/com.kevintcoughlin.smodr D/FFMPEG﹕ android source begin open
07-06 15:52:34.648    3363-3376/com.kevintcoughlin.smodr D/FFMPEG﹕ android open, url: android-source:0xb7c53e00|file:http://traffic.libsyn.com/joeroganexp/p518.mp3
07-06 15:52:34.648    3363-3376/com.kevintcoughlin.smodr D/FFMPEG﹕ ffmpeg open android data source success, source ptr: 0xb7c53e00
07-06 15:52:34.648    3363-3376/com.kevintcoughlin.smodr D/FFMPEG﹕ android source open success
07-06 15:52:34.708    3363-3394/com.kevintcoughlin.smodr D/dalvikvm﹕ GC_FOR_ALLOC freed 361K, 4% free 10852K/11288K, paused 75ms, total 75ms
07-06 15:52:34.844    3363-3376/com.kevintcoughlin.smodr I/FFMPEG﹕ [mp3 @ 0xb7ca7700] Estimating duration from bitrate, this may be inaccurate
07-06 15:52:34.844    3363-3376/com.kevintcoughlin.smodr I/FFMPEG﹕ Input #0, mp3, from 'android-source:0xb7c53e00|file:http://traffic.libsyn.com/joeroganexp/p518.mp3':
07-06 15:52:34.844    3363-3376/com.kevintcoughlin.smodr I/FFMPEG﹕ Metadata:
07-06 15:52:34.844    3363-3376/com.kevintcoughlin.smodr I/FFMPEG﹕ TSS             : Logic Pro 9.1.8
07-06 15:52:34.848    3363-3376/com.kevintcoughlin.smodr I/FFMPEG﹕ title           : #518 - Matt Fulchiron
07-06 15:52:34.848    3363-3376/com.kevintcoughlin.smodr I/FFMPEG﹕ artist          : Joe Rogan Experience
07-06 15:52:34.848    3363-3376/com.kevintcoughlin.smodr I/FFMPEG﹕ album_artist    : Joe Rogan Experience
07-06 15:52:34.848    3363-3376/com.kevintcoughlin.smodr I/FFMPEG﹕ Duration: 02:57:10.21, start: 0.000000, bitrate: 127 kb/s
07-06 15:52:34.848    3363-3376/com.kevintcoughlin.smodr I/FFMPEG﹕ Stream #0:0: Audio: mp3, 44100 Hz, stereo, s16p, 128 kb/s
07-06 15:52:34.848    3363-3376/com.kevintcoughlin.smodr I/FFmpegExtractor﹕ FFmpegExtrator, url: android-source:0xb7c53e00|file:http://traffic.libsyn.com/joeroganexp/p518.mp3, format_name: mp3, format_long_name: MP2/3 (MPEG audio layer 2/3)
07-06 15:52:34.852    3363-3376/com.kevintcoughlin.smodr I/FFmpegExtractor﹕ list the formats suppoted by ffmpeg:
07-06 15:52:34.852    3363-3376/com.kevintcoughlin.smodr I/FFmpegExtractor﹕ ========================================
07-06 15:52:34.852    3363-3376/com.kevintcoughlin.smodr V/FFmpegExtractor﹕ format_names[00]: mpeg
07-06 15:52:34.852    3363-3376/com.kevintcoughlin.smodr V/FFmpegExtractor﹕ format_names[01]: mpegts
07-06 15:52:34.852    3363-3376/com.kevintcoughlin.smodr V/FFmpegExtractor﹕ format_names[02]: mov,mp4,m4a,3gp,3g2,mj2
07-06 15:52:34.852    3363-3376/com.kevintcoughlin.smodr V/FFmpegExtractor﹕ format_names[03]: matroska,webm
07-06 15:52:34.852    3363-3376/com.kevintcoughlin.smodr V/FFmpegExtractor﹕ format_names[04]: asf
07-06 15:52:34.852    3363-3376/com.kevintcoughlin.smodr V/FFmpegExtractor﹕ format_names[05]: rm
07-06 15:52:34.852    3363-3376/com.kevintcoughlin.smodr V/FFmpegExtractor﹕ format_names[06]: flv
07-06 15:52:34.852    3363-3376/com.kevintcoughlin.smodr V/FFmpegExtractor﹕ format_names[07]: swf
07-06 15:52:34.852    3363-3376/com.kevintcoughlin.smodr V/FFmpegExtractor﹕ format_names[08]: avi
07-06 15:52:34.852    3363-3376/com.kevintcoughlin.smodr V/FFmpegExtractor﹕ format_names[09]: ape
07-06 15:52:34.852    3363-3376/com.kevintcoughlin.smodr V/FFmpegExtractor﹕ format_names[10]: dts
07-06 15:52:34.856    3363-3376/com.kevintcoughlin.smodr V/FFmpegExtractor﹕ format_names[11]: flac
07-06 15:52:34.856    3363-3376/com.kevintcoughlin.smodr V/FFmpegExtractor﹕ format_names[12]: ac3
07-06 15:52:34.856    3363-3376/com.kevintcoughlin.smodr V/FFmpegExtractor﹕ format_names[13]: wav
07-06 15:52:34.856    3363-3376/com.kevintcoughlin.smodr V/FFmpegExtractor﹕ format_names[14]: ogg
07-06 15:52:34.856    3363-3376/com.kevintcoughlin.smodr V/FFmpegExtractor﹕ format_names[15]: vc1
07-06 15:52:34.856    3363-3376/com.kevintcoughlin.smodr V/FFmpegExtractor﹕ format_names[16]: hevc
07-06 15:52:34.856    3363-3376/com.kevintcoughlin.smodr I/FFmpegExtractor﹕ ========================================
07-06 15:52:34.856    3363-3376/com.kevintcoughlin.smodr D/FFMPEG﹕ android source close
07-06 15:52:34.856    3363-3376/com.kevintcoughlin.smodr D/FFmpegExtractor﹕ SniffFFMPEG failed to sniff this source
07-06 15:52:34.856    3363-3397/com.kevintcoughlin.smodr D/dalvikvm﹕ GC_FOR_ALLOC freed 120K, 3% free 12342K/12696K, paused 29ms, total 60ms
07-06 15:52:34.860    3363-3397/com.kevintcoughlin.smodr I/dalvikvm-heap﹕ Grow heap (frag case) to 13.981MB for 1960012-byte allocation
07-06 15:52:34.872    3363-3387/com.kevintcoughlin.smodr D/dalvikvm﹕ GC_FOR_ALLOC freed <1K, 3% free 14256K/14612K, paused 10ms, total 10ms
07-06 15:52:34.880    3363-3376/com.kevintcoughlin.smodr I/OMXClient﹕ Using client-side OMX mux.
07-06 15:52:34.976    3363-3400/com.kevintcoughlin.smodr I/OMXClient﹕ Using client-side OMX mux.
07-06 15:52:35.144    3363-3393/com.kevintcoughlin.smodr D/dalvikvm﹕ GC_FOR_ALLOC freed 1512K, 12% free 13705K/15532K, paused 12ms, total 36ms
07-06 15:52:35.152    3363-3393/com.kevintcoughlin.smodr I/dalvikvm-heap﹕ Grow heap (frag case) to 15.315MB for 1962812-byte allocation
07-06 15:52:35.200    3363-3388/com.kevintcoughlin.smodr D/dalvikvm﹕ GC_FOR_ALLOC freed <1K, 11% free 15621K/17452K, paused 39ms, total 39ms
07-06 15:52:35.356    3363-3400/com.kevintcoughlin.smodr E/ACodec﹕ OMX/mediaserver died, signalling error!
07-06 15:52:35.356    3363-3400/com.kevintcoughlin.smodr E/MediaCodec﹕ Codec reported an error. (omx error 0x8000100d, internalError -32)
07-06 15:52:35.376    3363-3400/com.kevintcoughlin.smodr A/ACodec﹕ frameworks/av/media/libstagefright/ACodec.cpp:499 CHECK(mem.get() != NULL) failed.
07-06 15:52:35.376    3363-3400/com.kevintcoughlin.smodr A/libc﹕ Fatal signal 4 (SIGILL) at 0xb76d563d (code=2), thread 3400 (MediaCodec_loop)

To my untrained eye it seems like I can get the TrackInfo correctly, but am having a problem reading the data over HTTP. It also seems that how the framework sniffs the mimetype is failing even though I do receive type 'audio/mpeg'.

Again, I appreciate any direction I receive. I realize that these APIs are very new.

  • ExoPlayer Developer Docs
  • ExoPlayer Source
  • ExoPlayer Class Ref

Thanks!

like image 925
kevintcoughlin Avatar asked Jul 06 '14 16:07

kevintcoughlin


People also ask

Does YouTube use ExoPlayer?

Screenshot: The YouTube Android app, which uses ExoPlayer as its video player. ExoPlayer is an app-level media player built on top of low-level media APIs in Android. It is an open source project used by Google apps, including YouTube and Google TV.

What's the difference between exo player and VLC player?

VLC Media Player for Android is one free and open source cross-platform multimedia player. It can play almost any media files, discs, and streaming media. So it is a good choice. ExoPlayer is one open source project that plays media with minimal code.

What is HLS in ExoPlayer?

You can find its link here Introduction to Android ExoPlayer. In this blog, we are going to learn how to play live stream using ExoPlayer. We will be using HLS (HTTP Live Streaming) technology as communication protocol to serve the multimedia content. HLS is an adaptive streaming communications protocol.


1 Answers

The following code worked for me. I'm having difficulty hooking the exoPlayer up to the UI though.

String key = DeveloperKey.CLIENT_ID;
    // Construct the URL for the query
    final String BASE_URL = "https://api.soundcloud.com/tracks/101150664/stream?";
    final String CLIENTID_PARAM = "client_id";

    Uri builtUri = Uri.parse(BASE_URL).buildUpon()
            .appendQueryParameter(CLIENTID_PARAM, key)
            .build();

    Log.v(LOG_TAG, "BUILT URI FOR STREAMING: " + builtUri);

    // Build the sample source
    FrameworkSampleSource sampleSource = new FrameworkSampleSource(getActivity(), builtUri, null, 1);

    // Build the track renderers
    TrackRenderer audioRenderer = new MediaCodecAudioTrackRenderer(sampleSource, null, true);

    // Build the ExoPlayer and start playback
    ExoPlayer exoPlayer = ExoPlayer.Factory.newInstance(1);
    exoPlayer.prepare(audioRenderer);
    exoPlayer.setPlayWhenReady(true);
like image 51
mathee Avatar answered Nov 15 '22 00:11

mathee