zoukankan      html  css  js  c++  java
  • Android 之流媒体播放器,广播侧下方这么简单。

    没有其他的。希望从事流媒体开发案例。还承诺提供朋友博客。上个星期。制定出最后一点机会。

    在这里,与大家分享。

    首先要明白的概念:什么是流媒体?转载请注明出处http://blog.csdn.net/gaoshouxiaodi/article/details/41259351

    流媒体:所谓流媒体是指採用流式传输的方式在Internet播放的媒体格式。

    流媒体又叫流式媒体,它是指商家用一个视频传送server把节目当成数据包发出,传送到网络上。用户通过解压设备对这些数据进行解压后,节目就会像发送前那样显示出来。

    常见的流媒体的格式:mov .asf .3gp .viv .swf .rt .rp .ra .rm。每一种格式都有各自的优缺点。大家能够依据实际情况须要来决定。

    通俗上讲,通常实现流媒体的方法大致有三种。

    一。讲音视频文件拆分成若干多个小文件。在播放时。逐个下载。然后播放。也叫伪流媒体。

    二,将视频通过转换软件,在server端转换成流媒体格式文件。然后client进行播放。

    三。在本地录制视频的过程中。

    直接编解码为流媒体格式文件。(兴许的博客中我会单独讲这里)

    而实际上,流媒体的实现原理,也就跟第一点类似,仅仅只是能够理解为,拆分的包很多其它,更小。而仍然是一个总体。它的网络传输,相同是若干多得包单通道或者多通道下发的。

    我们熟知的安卓手机支持的视频格式并不多,3GP。mp4等。可针对广大需求来讲,这点支持确实少的可怜。那假设想在Android手机上播放其它格式的怎么办。这就涉及到视频的编解码。

    视频解码,分为软解码和硬解码。可惜两种我都不会。

    临时也不想会。

    还好。有那么一批人,他们无私奉献,在他们的字典里,他们的时间就是我们的时间。他们的金钱就是我们的金钱,他们的媳妇。。。哼。。

    他们叫做开源。

    我在网上找到了一个非常好的开源项目,vitamio 。这么好的东西,我之前居然不知道。于是我開始下载他们的sdk。Demo,开发文档等实用的东东。。

    可惜,,没看懂。。给我的感觉是他们提供的东西杂乱无章,可又确实是好东西,怎么办,耐着性子,搞!

    https://www.vitamio.org/docs/Tutorial/2014/0210/29.html粘上他们的介绍链接。

    感兴趣的朋友能够看一下。

    据不全然统计。vitamio框架支持不下百种视频格式。

    以下介绍下简单播放实现:

    首先是界面:

    <p>
    	
    
    	
    </p>
    <pre name="code" class="html"><?

    xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <io.vov.vitamio.widget.CenterLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <io.vov.vitamio.widget.VideoView android:id="@+id/surface_view" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerHorizontal="true" android:layout_centerVertical="true" /> </io.vov.vitamio.widget.CenterLayout> </LinearLayout>

    非常easy的一个现形布局界面,
    io.vov.vitamio.widget.VideoView
    是它的自己定义视频展示控件。

    然后是activity的实现:

    public class VideoViewDemo extends Activity {
    
    	/**
    	 * TODO: Set the path variable to a streaming video URL or a local media file
    	 * path.
    	 */
    	//视频路径
    	private String path = "";
    	private VideoView mVideoView;
    
    	@Override
    	public void onCreate(Bundle icicle) {
    		super.onCreate(icicle);
    		//对vitamio框架进行初始化。

    返回值用来做相关操作。通常没有要作的事情。初始化一定要在显示界面之前。 if (!LibsChecker.checkVitamioLibs(this)) return; //显示界面 setContentView(R.layout.videoview); //初始化组件 mVideoView = (VideoView) findViewById(R.id.surface_view); //设置的两个网络流媒体地址,大家能够直接进行測试。 // path = "http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8"; path = "http://www.modrails.com/videos/passenger_nginx.mov"; if (path == "") { // Tell the user to provide a media file URL/path. Toast.makeText(VideoViewDemo.this, "Please edit VideoViewDemo Activity, and set path" + " variable to your media file URL/path", Toast.LENGTH_LONG).show(); return; } else { /* * 也能够用这种方法来播放流媒体 * mVideoView.setVideoURI(Uri.parse(URLstring)); */ //设置videoview播放的路径 mVideoView.setVideoPath(path); //创建视频播放时的控制器,这个控制器能够自己定义。此处是默认的实现 mVideoView.setMediaController(new MediaController(this)); //请求焦点 mVideoView.requestFocus(); //设置播放监听 mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mediaPlayer) { // optional need Vitamio 4.0 //设置重放速度 mediaPlayer.setPlaybackSpeed(1.0f); } }); //载入结束后開始播放,这行代码能够控制视频的播放。 mVideoView.start(); } } }

    在使用之前。须要看一下VideoView类里的方法:

    类概述 


    public class VideoView extends SurfaceView implements MediaController.MediaPlayerControl
    用于播放视频文件。VideoView能够载入各种来源的图像(如资源或ContentProvider),注意计算视频尺寸。以便在随意布局管理器中使用,它还提供了诸如缩放等显示选项。
    VideoView也提供封装了很多MediaPlayer的方法,比如getVideoWidth、setSubShown。


    常量 


    public static final int VIDEO_LAYOUT_ORIGIN
    缩放參数。原始画面大小。
    常量值:0


    public static final int VIDEO_LAYOUT_SCALE
    缩放參数。画面全屏。
    常量值:1


    public static final int VIDEO_LAYOUT_STRETCH
    缩放參数。画面拉伸。


    常量值:2


    public static final int VIDEO_LAYOUT_ZOOM
    缩放參数,画面裁剪。
    常量值:3


    公共方法 


    public void setVideoLayout(int layout, float aspectRatio)
    获取扫描视频的Uri。
    參数
    layout 缩放參数
    aspectRation 宽高比,为0将自己主动检測。


    public boolean isValid()
    Surface是否有效。 參见Surface的isValid方法。




    public void setVideoPath(String path)
    设置视频路径。




    public void setVideoURI(Uri uri)
    设置视频URI。(能够是网络视频地址)


    public void stopPlayback()
    停止视频播放。并释放资源。


    public void setMediaController(MediaController controller)
    设置媒体控制器。
    參数
    controller 媒体控制器。注意是io.vov.vitamio.widget.MediaController。


    public void setOnPreparedListener(OnPreparedListener l)
    注冊一个回调函数,在视频预处理完毕后调用。

    在视频预处理完毕后被调用。此时视频的宽度、高度、宽高比信息已经获取到,此时可调用seekTo让视频从指定位置開始播放。


    public void setOnCompletionListener(OnCompletionListener l)
    注冊一个回调函数,视频播放完毕后调用。




    public void setOnErrorListener(OnErrorListener l)
    注冊一个回调函数,在异步操作调用过程中错误发生时调用。

    比如视频打开失败。




    public void setOnBufferingUpdateListener(OnBufferingUpdateListener l)
    注冊一个回调函数。在网络视频流缓冲变化时调用。




    public void setOnSeekCompleteListener(OnSeekCompleteListener l)
    注冊一个回调函数。在seek操作完毕后调用。


    public void setOnSubtitleUpdateListener(OnSubtitleUpdateListener l)
    注冊一个回调函数,在字幕须要显示时调用。


    public void setOnInfoListener(OnInfoListener l)
    注冊一个回调函数,在有警告或错误信息时调用。比如:開始缓冲、缓冲结束、下载速度变化。




    public boolean onTouchEvent(MotionEvent ev)
    处理显示/隐藏MediaController。




    public void start()
    開始播放。


    public void pause()
    暂停播放。


    public void suspend()
    挂起(临时没有实现功能)


    public void resume()
    恢复播放。




    public long getDuration()
    获取视频播放时长。


    public long getCurrentPosition()
    获取当前播放位置。




    public void seekTo(long msec)
    设置播放位置。
    參数
    msec 位置


    public boolean isPlaying()
    是否正在播放。




    public int getBufferPercentage()
    获取缓冲百分比。


    public void setVolume(float leftVolume, float rightVolume)
    设置音量。
    參数
    leftVolume 左声道
    rightVolume 右声道


    public int getVideoWidth()
    获取视频宽度。


    public int getVideoHeight()
    获取视频高度。


    public float getVideoAspectRatio()
    设置视频宽高比例。

    没有视频或者宽高不对返回0。


    public void setVideoQuality(int quality)
    设置视频质量。
    參数
    quality 參见MediaPlayer的常量:VIDEOQUALITY_LOW(流畅)、VIDEOQUALITY_MEDIUM(普通)、VIDEOQUALITY_HIGH(高质)。




    public void setBufferSize(int bufSize)
    设置视频缓冲大小(默认1024KB)单位Byte。




    public boolean isBuffering()
    检測是否缓冲完成。




    public void setMetaEncoding(String encoding)
    设置元数据编码。

    比如:UTF-8


    public String getMetaEncoding()
    获取元数据编码。


    public HashMap getAudioTrackMap(String encoding)
    获取视频中嵌入的音轨。比如:English


    public int getAudioTrack()
    设置播放音轨编号。


    public void setAudioTrack(int audioIndex)
    设置音轨编号,必须使用getAudioTrackMap的返回值。




    public void setSubShown(boolean shown)
    设置是否显示字幕。


    參数
    shown true表示显示字幕


    public void setSubEncoding(String encoding)
    设置字幕编码。


    參数
    encoding 字幕编码。假设为null将自己主动检測。




    public int getSubLocation()
    获取字幕位置类型。0为内嵌字幕,1为外挂字幕。




    public void setSubPath(String subPath)
    设置外挂字幕路径。必须是本地文件路径。


    public String getSubPath()
    获取外挂字幕路径。


    public void setSubTrack(int trackId)
    设置字幕编号。必须是getSubTrackMap的返回值。


    public int getSubTrack()
    获取字幕编号。


    public HashMap getSubTrackMap(String encoding)
    获取视频内嵌字幕集合。
    參数
    encoding 格式化字符串编码。假设为null将自己主动检測。
    返回值
    返回字幕名称和字幕编号组成的Map。


    public boolean canPause()
    是否可暂停。(临时没有实现功能)


    public boolean canSeekBackward()
    (临时没有实现功能)


    public boolean canSeekForward()
    (临时没有实现功能)


    受保护方法 


    protected boolean isInPlaybackState()
    是否处于正在播放的状态。


    实时证明。开源才是人类社会进步的阶梯。转载请注明出处。


    vitamio库下载地址


    对于流媒体编解码器。ffmpeg等待,下一次说起。





    
       
    
  • 相关阅读:
    初识多线程
    java开发中我们经常用到的一些名词
    gitHub提交代码
    Java-基础-HashMap
    Java-基础-LinkedList
    Java-基础-ArrayList
    Java-基础-JDK动态代理
    Java-基础-反射
    RabbitMQ-延迟队列
    RabbitMQ-TTL-死信队列_DLX
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5047195.html
Copyright © 2011-2022 走看看