Воспроизвести видео m3u8 на android

Я хочу транслировать видео в прямом эфире в формате m3u8. Итак, я попробовал приведенный ниже код

public class StreamingPlayer extends Activity implements
OnBufferingUpdateListener, OnCompletionListener,
OnPreparedListener, OnVideoSizeChangedListener, SurfaceHolder.Callback{

    private static final String TAG = StreamingPlayer.class.getSimpleName();
    private int mVideoWidth;
    private int mVideoHeight;
    private MediaPlayer mMediaPlayer;
    private SurfaceView mPreview;
    private SurfaceHolder holder;
    private String path;

    private boolean mIsVideoSizeKnown = false;
    private boolean mIsVideoReadyToBePlayed = false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mediaplayer_2);
        mPreview = (SurfaceView) findViewById(R.id.surface);
        holder = mPreview.getHolder();
        holder.addCallback(this);
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    private void playVideo() {
        doCleanUp();
        try {

            /*
             * TODO: Set path variable to progressive streamable mp4 or
             * 3gpp format URL. Http protocol should be used.
             * Mediaplayer can only play "progressive streamable
             * contents" which basically means: 1. the movie atom has to
             * precede all the media data atoms. 2. The clip has to be
             * reasonably interleaved.
             * 
             */

            path = "httplive://xboodangx.api.channel.livestream.com/3.0/playlist.m3u8";

            if (path == "") {
                // Tell the user to provide a media file URL.
                Toast
                .makeText(
                        this,
                        "Please edit MediaPlayerDemo_Video Activity,"
                        + " and set the path variable to your media file URL.",
                        Toast.LENGTH_LONG).show();
            } 

            Log.e("PATH", "Path = " + path);
            // Create a new media player and set the listeners
            mMediaPlayer = new MediaPlayer();
            mMediaPlayer.setDataSource(path);
            mMediaPlayer.setDisplay(holder);
                    mMediaPlayer.setOnBufferingUpdateListener(this);
                    mMediaPlayer.setOnPreparedListener(this);
            mMediaPlayer.prepare();
            mMediaPlayer.setOnCompletionListener(this);
            mMediaPlayer.setOnVideoSizeChangedListener(this);
            mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

        } catch (Exception e) {
            Log.e(TAG, "error: " + e.getMessage(), e);
        }
    }

    public void onBufferingUpdate(MediaPlayer arg0, int percent) {
        Log.d(TAG, "onBufferingUpdate percent:" + percent);

    }

    public void onCompletion(MediaPlayer arg0) {
        Log.d(TAG, "onCompletion called");
    }

    public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
        Log.v(TAG, "onVideoSizeChanged called");
        if (width == 0 || height == 0) {
            Log.e(TAG, "invalid video width(" + width + ") or height(" + height + ")");
            return;
        }
        mIsVideoSizeKnown = true;
        mVideoWidth = width;
        mVideoHeight = height;
        if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {
            startVideoPlayback();
        }
    }

    public void onPrepared(MediaPlayer mediaplayer) {
        Log.d(TAG, "onPrepared called");
        mIsVideoReadyToBePlayed = true;
        if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {
            startVideoPlayback();
        }
    }

    public void surfaceChanged(SurfaceHolder surfaceholder, int i, int j, int k) {
        Log.d(TAG, "surfaceChanged called");

    }

    public void surfaceDestroyed(SurfaceHolder surfaceholder) {
        Log.d(TAG, "surfaceDestroyed called");
    }


    public void surfaceCreated(SurfaceHolder holder) {
        Log.d(TAG, "surfaceCreated called");
        playVideo();

    }

    @Override
    protected void onPause() {
        super.onPause();
        releaseMediaPlayer();
        doCleanUp();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        releaseMediaPlayer();
        doCleanUp();
    }

    private void releaseMediaPlayer() {
        if (mMediaPlayer != null) {
            mMediaPlayer.release();
            mMediaPlayer = null;
        }
    }

    private void doCleanUp() {
        mVideoWidth = 0;
        mVideoHeight = 0;
        mIsVideoReadyToBePlayed = false;
        mIsVideoSizeKnown = false;
    }

    private void startVideoPlayback() {
        Log.v(TAG, "startVideoPlayback");
        holder.setFixedSize(mVideoWidth, mVideoHeight);
        mMediaPlayer.start();
    }


}

В logcat отображается onBufferingUpdate percent:100 Но я не вижу видео.

Аудио работает, но внезапно его поразило.

И я попробовал эту ссылку на видео http://devimages.apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8 он работает. Но моя ссылка на видео не работает, и я изменил httplive://... instead of http://, но бесполезно.

И я видел этот ответ также Android Video Stream mms и m3u8 .

В приведенной выше ссылке отображается сообщение "Невозможно воспроизвести видео".


person Ramakrishna    schedule 25.11.2011    source источник
comment
Вы пробовали протестировать это на реальном устройстве? иногда эмулятор отстой при работе с HTTP Live Streaming.   -  person yorkw    schedule 26.11.2011
comment
@yorkw Спасибо за ответ. Да, я тестировал на реальном устройстве, а не в эмуляторе.   -  person Ramakrishna    schedule 26.11.2011
comment
URI h t t p: //myvideo.m3u8 мне кажется странным, где вы размещаете медиа? удаленный сервер? Если у вас есть доступ к широковещательному коду на стороне сервера, попробуйте изменить его на более надежный URL, например h t t p: //domain-name/service-name/myvideo.m3u8. не уверен, работает ли это, но стоит попробовать.   -  person yorkw    schedule 27.11.2011
comment
этот код работает или редакция была до устранения проблемы?   -  person Guillermo Varini    schedule 19.01.2012


Ответы (6)


Видео существовало на http://www.livestream.com. В нем есть Mobile Api для потоковой передачи в прямом эфире.

Api:

http://www.livestream.com/userguide/index.php?title=Mobile_API#How_to_get_mobile_compatible_clips_from_a_channel.27s_library

В приведенной выше ссылке есть полная информация для мобильных устройств. Чтобы получить ссылку rtsp с канала, используйте эту ссылку

http://xproshowcasex.channel-api.livestream-api.com/2.0/getstream

Замените название вашего канала вместо proshowcase. А затем получите все мобильные совместимые URL-адреса, такие как IPhone, Android, Blackberry и т. Д.,

Используя этот URL-адрес, вы можете транслировать видео в Android с помощью просмотра видео или медиаплеера.

Для получения дополнительной информации прочтите ссылку Mobile Api.

Если у кого-то возникнет такая же проблема, я надеюсь, что этот ответ вам поможет.

Удачи.

person Ramakrishna    schedule 09.12.2011
comment
@GuillermoVarini Приведенный выше код мне не подходит. Пожалуйста, прочтите мой ответ и подробно расскажите мне о своей проблеме, и я отвечу, если знаю. - person Ramakrishna; 20.01.2012
comment
проблема в том, что мне нужно воспроизвести видео m3u8 в приложении 2.1, и я не могу найти реальный пример того, как это сделать. нашел здесь 2 сообщения, но не сработало. также проверил на developer.android.com/, но ничего: Вы говорите, что с этим api это работает? есть пример как реализовать? - person Guillermo Varini; 20.01.2012
comment
На самом деле мое видео существует на livestream.com, поэтому для этого у меня уже есть api, я разместил эту ссылку api выше. из этого я получил ссылку rtsp, а затем я воспроизвел видео по ссылке rtsp, используя просмотр видео - person Ramakrishna; 20.01.2012
comment
Эта ссылка больше не работает. xproshowcasex.channel-api.livestream-api.com/2.0/getstream - person chovy; 07.05.2015

У меня нет проблем с воспроизведением стрима:

videoView1.setVideoPath("http://***.net/livedemo/_definst_/stream3.stream/playlist.m3u8?wowzasessionid=773395207");
videoView1.start();

О сообщении:

Видео не может быть воспроизведено

Возможно, вам нужно добавить разрешения к вашему файлу манифеста:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
person SerjG    schedule 06.09.2012
comment
‹Использует-разрешение android: name = android.permission.ACCESS_NETWORK_STATE /› не требуется. - person Jorgesys; 09.01.2014
comment
Та же проблема. Вы нашли решение? - person Florescu Cătălin; 06.06.2017
comment
‹Использует-разрешение android: name = android.permission.INTERNET /› ‹использует-разрешение android: name = android.permission.ACCESS_NETWORK_STATE /› - person SerjG; 06.06.2017

Я думаю, вам стоит переместить это:

mMediaPlayer.setOnPreparedListener(this);

Быть до звонка в prepare()

person MByD    schedule 25.11.2011
comment
Спасибо за ответ. Я реализовал вашу идею, но она не работает. Пока не отобразится onBufferingUpdate percent: 100, и я не могу посмотреть видео. - person Ramakrishna; 25.11.2011

Вы пытались воспроизвести ссылку с помощью встроенного плеера напрямую через веб-браузер? Если вы не можете воспроизвести его с помощью встроенного плеера, это означает, что ваш файл не поддерживается вашей текущей версией Android. Формат HTTP Live Streaming может иметь некоторые особенности, которые не поддерживаются Android, тогда как он может воспроизводиться на IOS.

person nonococo    schedule 25.11.2011
comment
Спасибо за ответ. Работает он в родном плеере Android и в IOS тоже. Там уже выполнена эта задача. - person Ramakrishna; 25.11.2011

Я пробовал видео в формате m3u8 более 6 месяцев, но безуспешно. Он воспроизводится в моем приложении для iPhone и в нативных приложениях. Мой потоковый сервер - Red5, и на нем нет плагина RTSP. Он выдает потоковую передачу по RTMP, и ее нельзя транслировать в Android. Я ждал год, чтобы получить ОС с поддержкой потоковой передачи RTSP, но в Google нет. Тем не менее, я использую веб-просмотр с флеш-плеером для потоковой передачи видео в реальном времени (это не очень четкое изображение). Мне стыдно говорить это моему клиенту и продолжать поиск, чтобы воспроизвести прямую трансляцию в проигрывателе Android по умолчанию.

Я думаю, ваш URL-адрес видео может не RTSP.

person arshad    schedule 22.08.2012

Как играть в потоковую передачу .M3U8 на Android

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <VideoView
        android:id="@+id/myVideoView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

Main.java

package com.grexample.ooyalalive;

import java.net.URL;
import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.widget.MediaController;
import android.widget.VideoView;

public class Main extends Activity {

    private String urlStream;
    private VideoView myVideoView;
    private URL url;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_vv);//***************
            myVideoView = (VideoView)this.findViewById(R.id.myVideoView);
            MediaController mc = new MediaController(this);
            myVideoView.setMediaController(mc);         
            urlStream = "http://jorgesys.net/i/irina_delivery@117489/master.m3u8";

            myVideoView.setVideoURI(Uri.parse(urlStream)); 

    }
}

Я видел, что у многих людей возникают проблемы с воспроизведением .M3U8, это зависит от кодеков, используемых для потоковой передачи и совместимости с устройством, например, некоторые из моих файлов .m3u8 поддерживаются только на устройствах с экранами 1200 x800 и выше.

person Jorgesys    schedule 08.01.2014