2015-07-14 7 views
9

videoview और mediaplayer का उपयोग करके m3u8 फ़ाइलों को चलाने के कई तरीकों की कोशिश करने के बाद मैंने छोड़ने का फैसला किया। हर बार जब मैं m3u8 फ़ाइल चलाता हूं तो मैं केवल आवाज सुनता हूं। (कृपया मेरे प्रश्न का उत्तर देने वाले स्टैक ओवरफ़्लो से यूआरएल न लिखें। मैंने उन्हें सब लाल कर दिया है) आसपास पूछे गए, आखिर में यह पता चला कि एक्सप्लियर शायद मैं एक ' मैं देख रहा हूँ हालांकि एक्सप्लेयर एक नौसिखिया प्रतीत होता है और मुझे कोई उचित ट्यूटोरियल नहीं मिल रहा है। ऐसा कहा जाता है कि मैं खुद को नौसिखिया हूं और ट्रैकर और ब्लब्ला के बारे में सभी वार्ता मेरे लिए बहुत जटिल लगती है। मैं केवल अपने एपी में विभिन्न यूआरएल फाइलों को के बिना वीएलसी या किसी बाहरी इरादे से गुजरने में सक्षम होना चाहता हूं।एक्सप्लेयर m3u8 फ़ाइलों को चला रहा है एंड्रॉइड

रिकॉर्ड के लिए मैं किटकैट और ऊपर का उपयोग करता हूं। तो exoplayer लागू करने योग्य होना चाहिए।

तो क्या मैं desperatly के लिए पूछ रहा है कि कैसे मैं अपने m3u8 exoplayer का उपयोग करके फ़ाइलें या anyother तरह से है कि वीडियो से पता चलता खेलते हैं और ऑडियो खेल सकते हैं में एक सरल ट्यूटोरियल और नहीं सिर्फ उनमें से एक है। कृपया मुझे google dev पर exoplayer पृष्ठ से लिंक न करें। मैं भी वहां गया था।

अग्रिम धन्यवाद :)

+0

कोई भी? मदद? मैं इसे – Payam30

उत्तर

3

Android 4.1+ पर, आप इस पुस्तकालय https://github.com/brianwernick/ExoMedia/ उपयोग कर सकते हैं उम्मीद है। रीड-मी पेज पर उल्लिखित उदाहरण आपको शुरू करने के लिए पर्याप्त होना चाहिए। मैंने कुछ जोड़/संशोधनों के साथ कोड स्निपेट को दोबारा बनाया है।

  private void setupVideoView() { 
       EMVideoView emVideoView = (EMVideoView)findViewById(R.id.video_play_activity_video_view); 
       emVideoView.setOnPreparedListener(this); 

       //Enter your m3u8 URL below 
       emVideoView.setVideoURI(Uri.parse("http://SOMESERVER/playlist.m3u8")); 
      } 

      @Override 
      public void onPrepared(MediaPlayer mp) { 
       //Starts the video playback as soon as it is ready 
       emVideoView.start(); 
      } 

      @Override 
      public void onPause() { 
       super.onPause(); 
       //Pause Video Playback 
       emVideoView.pause(); 
      } 
0

वहाँ ExoPlayer पर कोई ट्यूटोरियल अभी हैं। ExoPlayerMediaPlayer का सबसे अच्छा विकल्प है लेकिन इस समय बहुत ही नौसिखिया मित्रवत नहीं है।

आपको क्या करना है github पेज पर जाना है और demo ऐप में DemoPlayer कक्षा पर एक नज़र डालें।

यह ऐप hls सहित कई अलग-अलग प्रारूपों को खोल सकता है।

+1

को मंजूरी दे दूंगा मैं डेमो का उपयोग कैसे करूं? क्या मुझे कोड को मेरे ऐप में कॉपी करने की ज़रूरत है? – Payam30

1

यह सबसे आसान तरीका है ExoPlayer लिब का उपयोग करके फ़ाइलें m3u8 स्ट्रीम करने के लिए मदद करने के लिए https://github.com/karim23/SimpleStreamPlayer/tree/master

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    context = getApplicationContext(); 
    setContentView(R.layout.activity_main); 
    //change the live streaming URL with yours. 
    contentUri = "http://abclive.abcnews.com/i/[email protected]/index_1200_av-b.m3u8?sd=10&b=1200&rebase=on"; 
    // contentType = DemoUtil.TYPE_HLS; 
    final Intent intent = new Intent(context, VideoPlayerActivity.class).setData(Uri.parse(contentUri)) 
      .putExtra(VideoPlayerActivity.CONTENT_ID_EXTRA, -1) 
      //Change the type according to the live streaming extension. 
      .putExtra(VideoPlayerActivity.CONTENT_TYPE_EXTRA, DemoUtil.TYPE_HLS); 
    liveStreamingTv =(TextView)findViewById(R.id.mainActivity_liveStreamingTv); 
    liveStreamingTv.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      startActivity(intent); 
     } 
    }); 
} 
1

मैं

सबसे पहले अपनी फ़ाइल को Gradle निर्भरता जोड़ने

compile 'com.google.android.exoplayer:exoplayer:r2.4.0' 

इनपुट के रूप में भंडारण master.m3u8 पथ के साथ एक सरल लेआउट फ़ाइल बनाएँ m3u8 मीडिया फ़ाइल चलाने में एक डेमो एप्लिकेशन बनाया है और डाउनलोड की गई फ़ाइलों को चलाने के लिए SimpleExoPlayerView व्यू देखें।

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout mlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" android:layout_height="match_parent"> 

<android.support.design.widget.TextInputEditText 
    android:layout_marginTop="15dp" 
android:layout_width="match_parent" 
    android:id="@+id/mediaPath" 
    android:layout_height="56dp" /> 
    <android.support.v7.widget.AppCompatButton 
android:id="@+id/play" 
     android:layout_marginLeft="50dp" 
android:layout_marginRight="50dp" 
     android:layout_below="@+id/mediaPath" 
     android:background="@color/colorAccent" 
android:layout_width="match_parent" 
android:text="Play" 
android:layout_height="56dp" /> 
<com.google.android.exoplayer2.ui.SimpleExoPlayerView 
    android:layout_below="@+id/play" 
    android:id="@+id/video_view" 
    android:layout_marginTop="5dp" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"/> 
</RelativeLayout> 

फ़ाइलें चलाने के लिए एक सरल एक्सोप्लेयर गतिविधि बनाएं।

public class ExoPlayer extends AppCompatActivity{ 
Context mContext; 
SimpleExoPlayerView playerView; 
EditText editText; 
private ComponentListener componentListener; 
private DataSource.Factory mediaDataSourceFactory; 
private Handler mainHandler; 
private DefaultTrackSelector trackSelector; 
SimpleExoPlayer player; 
private static final DefaultBandwidthMeter BANDWIDTH_METER = new  DefaultBandwidthMeter(); 




@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_exoplayer); 
    mContext =this; 
    editText = (EditText) findViewById(R.id.mediaPath); 
    Button btnPlay = (Button) findViewById(R.id.play); 
    playerView = (SimpleExoPlayerView)findViewById(R.id.video_view); 
    mediaDataSourceFactory = buildDataSourceFactory(true); 
    mainHandler = new Handler(); 
    componentListener = new ComponentListener(); 
    trackSelector = new DefaultTrackSelector(); 
    btnPlay.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
     if(editText.getText()!=null && editText.getText().length()>0){ 
       initializePlayer(editText.getText().toString()); 
      } 
     } 
    }); 
} 
    private DataSource.Factory buildDataSourceFactory(boolean useBandwidthMeter) { 
    return ((AnalyticsApplication) getApplication()) 
      .buildDataSourceFactory(useBandwidthMeter ? BANDWIDTH_METER : null); 
} 

    private void initializePlayer(String path) { 
    player = ExoPlayerFactory.newSimpleInstance(mContext, trackSelector); 
    player.addListener(componentListener); 
//  String path = file:///storage/emulated/0/SugarBox/master.m3u8"; 
    Uri uri = Uri.parse(path); 
    MediaSource mediaSource = buildMediaSource(uri); 
    player.prepare(mediaSource, true, false); 
    playerView.setPlayer(player); 
} 
    private MediaSource buildMediaSource(Uri uri) { 
return new HlsMediaSource(uri, mediaDataSourceFactory, mainHandler, null); 
} 
private void releasePlayer() { 
    if (player != null) { 
     player.removeListener(componentListener); 
     player.release(); 
     player = null; 
    } 
    } 



@Override 
public void onStart() { 
    super.onStart(); 
    if (Util.SDK_INT > 23) { 
     if(editText.getText()!=null && editText.getText().length()>0){ 
      initializePlayer(editText.getText().toString()); 
     } 
    } 
} 




@Override 
    public void onResume() { 
    super.onResume(); 
    if ((Util.SDK_INT <= 23 || player == null)) { 
     if(editText.getText()!=null && editText.getText().length()>0){ 
      initializePlayer(editText.getText().toString()); 
     } 
    } 
} 



@Override 
public void onPause() { 
    super.onPause(); 
    if (Util.SDK_INT <= 23) { 
     releasePlayer(); 
    } 
} 



@Override 
public void onStop() { 
    super.onStop(); 
    if (Util.SDK_INT > 23) { 
     releasePlayer(); 
    } 
} 







    private class ComponentListener implements com.google.android.exoplayer2.ExoPlayer.EventListener{ 

    @Override 
    public void onPlayerStateChanged(boolean playWhenReady, 
            int playbackState) { 
     String stateString; 
     switch (playbackState) { 
      case com.google.android.exoplayer2.ExoPlayer.STATE_IDLE: 
       stateString = "ExoPlayer.STATE_IDLE  -"; 
       break; 
      case com.google.android.exoplayer2.ExoPlayer.STATE_BUFFERING: 
       stateString = "ExoPlayer.STATE_BUFFERING -"; 
       break; 
      case com.google.android.exoplayer2.ExoPlayer.STATE_READY: 
       stateString = "ExoPlayer.STATE_READY  -"; 
       break; 
      case com.google.android.exoplayer2.ExoPlayer.STATE_ENDED: 
       stateString = "ExoPlayer.STATE_ENDED  -"; 
       break; 
      default: 
       stateString = "UNKNOWN_STATE    -"; 
       break; 
     } 
     Log.d("ExopLayer", "changed state to " + stateString 
       + " playWhenReady: " + playWhenReady); 
    } 

    @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 onPlayerError(ExoPlaybackException error) {} 
    @Override 
    public void onPositionDiscontinuity() {} 
    @Override 
    public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {} 
    } 



private DrmSessionManager<FrameworkMediaCrypto> buildDrmSessionManager(UUID uuid, String licenseUrl, String[] keyRequestPropertiesArray) throws UnsupportedDrmException { 
    if (Util.SDK_INT < 18) { 
     return null; 
    } 
    HttpMediaDrmCallback drmCallback = new HttpMediaDrmCallback(licenseUrl, 
      buildHttpDataSourceFactory(false)); 
    if (keyRequestPropertiesArray != null) { 
     for (int i = 0; i < keyRequestPropertiesArray.length - 1; i += 2) { 
      drmCallback.setKeyRequestProperty(keyRequestPropertiesArray[i], 
        keyRequestPropertiesArray[i + 1]); 
     } 
    } 
    return new DefaultDrmSessionManager<>(uuid, 
      FrameworkMediaDrm.newInstance(uuid), drmCallback, null, mainHandler, null); 
} 




    private HttpDataSource.Factory buildHttpDataSourceFactory(boolean useBandwidthMeter) { 
    return ((AnalyticsApplication) getApplication()) 
      .buildHttpDataSourceFactory(useBandwidthMeter ? BANDWIDTH_METER : null); 


    } 


} 
संबंधित मुद्दे