使用 Vitamio 库流式传输 m3u8

Posted

技术标签:

【中文标题】使用 Vitamio 库流式传输 m3u8【英文标题】:Streaming m3u8 using Vitamio library 【发布时间】:2016-02-13 19:03:05 【问题描述】:

我正在使用 Vitamio library 流式传输 m3u8,但它不起作用。 日志猫:avformat_open_input: Invalid data found when processing input : -1094995529 这是我尝试过的:

视频流:

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import io.vov.vitamio.LibsChecker;
import io.vov.vitamio.MediaPlayer;
import io.vov.vitamio.MediaPlayer.OnBufferingUpdateListener;
import io.vov.vitamio.MediaPlayer.OnInfoListener;
import io.vov.vitamio.widget.VideoView;


public class VideoStream extends Activity implements OnInfoListener, OnBufferingUpdateListener 
    private static final String TAG = "VideoStream";
    private String path;

    private VideoView mVideoView;
    private ProgressBar pb;
    private TextView downloadRateView, loadRateView;
    private Uri uri;



    @Override
    public void onCreate(Bundle icicle) 
        super.onCreate(icicle);
        if (!LibsChecker.checkVitamioLibs(this))
            return;
        setContentView(R.layout.video_stream);

        path = "http://video4.earthcam.com/fecnetwork/fridays_5th.flv/playlist.m3u8";

        mVideoView = (VideoView) findViewById(R.id.buffer);
        pb = (ProgressBar) findViewById(R.id.probar);

        downloadRateView = (TextView) findViewById(R.id.download_rate);
        loadRateView = (TextView) findViewById(R.id.load_rate);
        uri = Uri.parse(path);
        mVideoView.setVideoURI(uri);
        mVideoView.setMediaController(new MediaController(this));
        mVideoView.requestFocus();
        mVideoView.setOnInfoListener(this);
        mVideoView.setOnBufferingUpdateListener(this);
        mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() 
            @Override
            public void onPrepared(MediaPlayer mediaPlayer) 
                // optional need Vitamio 4.0
                mediaPlayer.setPlaybackSpeed(1.0f);
            
        );
    
    @Override
    public boolean onInfo(MediaPlayer mp, int what, int extra) 
        switch (what) 
            case MediaPlayer.MEDIA_INFO_BUFFERING_START:
                if (mVideoView.isPlaying()) 
                    mVideoView.pause();
                    pb.setVisibility(View.VISIBLE);
                    downloadRateView.setText("");
                    loadRateView.setText("");
                    downloadRateView.setVisibility(View.VISIBLE);
                    loadRateView.setVisibility(View.VISIBLE);

                
                break;
            case MediaPlayer.MEDIA_INFO_BUFFERING_END:
                mVideoView.start();
                pb.setVisibility(View.GONE);
                downloadRateView.setVisibility(View.GONE);
                loadRateView.setVisibility(View.GONE);
                break;
            case MediaPlayer.MEDIA_INFO_DOWNLOAD_RATE_CHANGED:
                downloadRateView.setText("" + extra + "kb/s" + "  ");
                break;
        
        return true;
    

    @Override
    public void onBufferingUpdate(MediaPlayer mp, int percent) 
        loadRateView.setText(percent + "%");
    

video_stream.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:orientation="vertical" >

    <io.vov.vitamio.widget.CenterLayout
        android:layout_
        android:layout_
        android:orientation="vertical" >

        <io.vov.vitamio.widget.VideoView
            android:id="@+id/buffer"
            android:layout_
            android:layout_
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true" />
    </io.vov.vitamio.widget.CenterLayout>

    <LinearLayout
        android:layout_
        android:layout_
        android:layout_centerInParent="true"
        android:orientation="horizontal" >

        <ProgressBar
            android:id="@+id/probar"
            style="?android:attr/progressBarStyleSmall"
            android:layout_
            android:layout_ />

        <TextView
            android:id="@+id/download_rate"
            android:layout_
            android:layout_
            android:layout_gravity="center"
            android:text="" />

        <TextView
            android:id="@+id/load_rate"
            android:layout_
            android:layout_
            android:layout_gravity="center"
            android:text="" />
    </LinearLayout>

</RelativeLayout>

清单:

    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name">
      <activity android:name=".VideoStream"
                android:configChanges="orientation|screenSize|smallestScreenSize|keyboard|keyboardHidden"
                android:label="@string/app_name"
                android:launchMode="singleTop"
                android:screenOrientation="landscape">
             <activity
                android:name="io.vov.vitamio.activity.InitActivity"
                android:configChanges="orientation|screenSize|smallestScreenSize|keyboard|keyboardHidden|navigation"
                android:launchMode="singleTop"
                android:theme="@android:style/Theme.NoTitleBar"
                android:windowSoftInputMode="stateAlwaysHidden" />

问题似乎与 Vitamio 有关。我怎样才能绕过这个崩溃? 非常感谢。

【问题讨论】:

【参考方案1】:

2天后,我找到了解决方案:) 所以我首先要说的是我很困惑! 您可能需要像我一样使用Vitamio。现在的问题是,如果将库作为本地库项目(File-New-Import 模块)包含在内,它应该可以正常工作,但如果通过添加依赖项来包含它(compile 'me.neavo:vitamio:4.2.2' ) 在build.gradle中,出现上述问题。

【讨论】:

【参考方案2】:

当您使用https://url 时,请重新输入http://url,因为它仅支持 MMS RTSP (RTP, SDP)、RTMP HTTP 受限协议和库作为模块添加到您的项目中。

【讨论】:

以上是关于使用 Vitamio 库流式传输 m3u8的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Vitamio 中启用字幕 (SRT) 支持?

寻找一个库/框架将实时视频从 OS X 流式传输到 Wowza 服务器(RTMP)[关闭]

哪些库可用于使用 WritableStream 和 Node.js Readable 等标准流 API 将数据从浏览器流式传输到服务器? [关闭]

如何使用 mediaRecorder 流式传输 android 的内部音频+屏幕?

Haskell 中字节流的高效流式传输和操作

使用 Vue.js 在 Janus 上流式传输