【VLC-Android】vlc-android简例——注意参考文献

2024-02-05 09:18

本文主要是介绍【VLC-Android】vlc-android简例——注意参考文献,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


http://www.cnblogs.com/over140/p/3932784.html


前言

  继续折腾vlc,做这个例子并不顺利,卡在只有声音没有图像这个问题好久,网上的例子有些API已经对不上,继续分享,,,

 

声明
  欢迎转载,但请保留文章原始出处:) 
    博客园:http://www.cnblogs.com
    农民伯伯: http://over140.cnblogs.com

 

正文

  截图

    

  项目

    

  代码

复制代码
public class VlcVideoActivity extends Activity implements SurfaceHolder.Callback, IVideoPlayer {private final static String TAG = "[VlcVideoActivity]";private SurfaceView mSurfaceView;private LibVLC mMediaPlayer;private SurfaceHolder mSurfaceHolder;private View mLoadingView;private int mVideoHeight;private int mVideoWidth;private int mVideoVisibleHeight;private int mVideoVisibleWidth;private int mSarNum;private int mSarDen;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_video_vlc);mSurfaceView = (SurfaceView) findViewById(R.id.video);mLoadingView = findViewById(R.id.video_loading);try {mMediaPlayer = VLCInstance.getLibVlcInstance();} catch (LibVlcException e) {e.printStackTrace();}mSurfaceHolder = mSurfaceView.getHolder();mSurfaceHolder.setFormat(PixelFormat.RGBX_8888);mSurfaceHolder.addCallback(this);mMediaPlayer.eventVideoPlayerActivityCreated(true);EventHandler em = EventHandler.getInstance();em.addHandler(mVlcHandler);this.setVolumeControlStream(AudioManager.STREAM_MUSIC);mSurfaceView.setKeepScreenOn(true);//        mMediaPlayer.setMediaList();//        mMediaPlayer.getMediaList().add(new Media(mMediaPlayer, "http://live.3gv.ifeng.com/zixun.m3u8"), false);//        mMediaPlayer.playIndex(0);mMediaPlayer.playMRL("http://live.3gv.ifeng.com/zixun.m3u8");}@Overridepublic void onPause() {super.onPause();if (mMediaPlayer != null) {mMediaPlayer.stop();mSurfaceView.setKeepScreenOn(false);}}@Overrideprotected void onDestroy() {super.onDestroy();if (mMediaPlayer != null) {mMediaPlayer.eventVideoPlayerActivityCreated(false);EventHandler em = EventHandler.getInstance();em.removeHandler(mVlcHandler);}}@Overridepublic void onConfigurationChanged(Configuration newConfig) {setSurfaceSize(mVideoWidth, mVideoHeight, mVideoVisibleWidth, mVideoVisibleHeight, mSarNum, mSarDen);super.onConfigurationChanged(newConfig);}@Overridepublic void surfaceCreated(SurfaceHolder holder) {if (mMediaPlayer != null) {mSurfaceHolder = holder;mMediaPlayer.attachSurface(holder.getSurface(), this);}}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {mSurfaceHolder = holder;if (mMediaPlayer != null) {mMediaPlayer.attachSurface(holder.getSurface(), this);//, width, height
        }if (width > 0) {mVideoHeight = height;mVideoWidth = width;}}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {if (mMediaPlayer != null) {mMediaPlayer.detachSurface();}}@Overridepublic void setSurfaceSize(int width, int height, int visible_width, int visible_height, int sar_num, int sar_den) {mVideoHeight = height;mVideoWidth = width;mVideoVisibleHeight = visible_height;mVideoVisibleWidth = visible_width;mSarNum = sar_num;mSarDen = sar_den;mHandler.removeMessages(HANDLER_SURFACE_SIZE);mHandler.sendEmptyMessage(HANDLER_SURFACE_SIZE);}private static final int HANDLER_BUFFER_START = 1;private static final int HANDLER_BUFFER_END = 2;private static final int HANDLER_SURFACE_SIZE = 3;private static final int SURFACE_BEST_FIT = 0;private static final int SURFACE_FIT_HORIZONTAL = 1;private static final int SURFACE_FIT_VERTICAL = 2;private static final int SURFACE_FILL = 3;private static final int SURFACE_16_9 = 4;private static final int SURFACE_4_3 = 5;private static final int SURFACE_ORIGINAL = 6;private int mCurrentSize = SURFACE_BEST_FIT;private Handler mVlcHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {if (msg == null || msg.getData() == null)return;switch (msg.getData().getInt("event")) {case EventHandler.MediaPlayerTimeChanged:break;case EventHandler.MediaPlayerPositionChanged:break;case EventHandler.MediaPlayerPlaying:mHandler.removeMessages(HANDLER_BUFFER_END);mHandler.sendEmptyMessage(HANDLER_BUFFER_END);break;case EventHandler.MediaPlayerBuffering:break;case EventHandler.MediaPlayerLengthChanged:break;case EventHandler.MediaPlayerEndReached://播放完成break;}}};private Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case HANDLER_BUFFER_START:showLoading();break;case HANDLER_BUFFER_END:hideLoading();break;case HANDLER_SURFACE_SIZE:changeSurfaceSize();break;}}};private void showLoading() {mLoadingView.setVisibility(View.VISIBLE);}private void hideLoading() {mLoadingView.setVisibility(View.GONE);}private void changeSurfaceSize() {// get screen sizeint dw = getWindowManager().getDefaultDisplay().getWidth();int dh = getWindowManager().getDefaultDisplay().getHeight();// calculate aspect ratiodouble ar = (double) mVideoWidth / (double) mVideoHeight;// calculate display aspect ratiodouble dar = (double) dw / (double) dh;switch (mCurrentSize) {case SURFACE_BEST_FIT:if (dar < ar)dh = (int) (dw / ar);elsedw = (int) (dh * ar);break;case SURFACE_FIT_HORIZONTAL:dh = (int) (dw / ar);break;case SURFACE_FIT_VERTICAL:dw = (int) (dh * ar);break;case SURFACE_FILL:break;case SURFACE_16_9:ar = 16.0 / 9.0;if (dar < ar)dh = (int) (dw / ar);elsedw = (int) (dh * ar);break;case SURFACE_4_3:ar = 4.0 / 3.0;if (dar < ar)dh = (int) (dw / ar);elsedw = (int) (dh * ar);break;case SURFACE_ORIGINAL:dh = mVideoHeight;dw = mVideoWidth;break;}mSurfaceHolder.setFixedSize(mVideoWidth, mVideoHeight);ViewGroup.LayoutParams lp = mSurfaceView.getLayoutParams();lp.width = dw;lp.height = dh;mSurfaceView.setLayoutParams(lp);mSurfaceView.invalidate();}
}
复制代码

    代码说明 

      1、vlc-android的版本为2.2.0-pre1 Weatherwax

      2、拷贝vlc-android官网例子下面org.videolan.libvlc所有的类,以及VLCInstance、Preferences。只有声音没有画面就出在VLCInstance这个问题上,少了一些配置,参考VLCInstance.updateLibVlcSettings。

      3、playMRL不要用Uri来转,否则打不开

      4、提供的代码已经编译好了so,也修改源码打开了EventHandler.MediaPlayerBuffering(也修改了libvlcjni.c),但是还是没有缓冲进度的值,还有待进一步探索。

      5、实际发现如果只在surfaceChanged中attachSurface,setSurfaceSize回调不会触发,需要同时在surfaceCreated中设置。

      6、本文不讨论Handler非静态可能引发内存泄露的问题,大家写的时候自己注意一下 :) 

 

  下载

    https://github.com/over140/vlc-android-demo (注意工程是Android Studio的工程)

 

  文章

    1、vlc-android 中调用用libvlcjni.so实现流媒体播放 

    2、[Github]vlc-android-macbuild

    3、vlc android的编译及截图,录制视频等功能

    4、vlc-android源码编译过程记录

    5、vlc-android 获取MediaPlayerEncounteredError,MediaPlayerBuffering等各种事件的响应

    6、Vlc-for-android源码分析

 

结束

   文章2的GitHub项目是对vlc进行封装,也挺不错了,值得参考。vlc-android的例子写的比较复杂,而且api可能老变,大家看文章的时候注意一下版本问题。

分类:  3、Android
标签:  vlc android,  vlc android no video,  vlc android 只有声音,  vlc android例子,  vlc android 代码
好文要顶  关注我  收藏该文   
农民伯伯
关注 - 3
粉丝 - 4144
荣誉: 推荐博客
+加关注
3
0
posted on  2014-08-24 17:55  农民伯伯 阅读( 39518) 评论( 35)  编辑  收藏

评论:
#1楼   2014-09-04 09:10 |  方方@鹏鹏 
请问您有没有Android eclipse的例子?
支持(0) 反对(0)
  
#2楼   2014-11-07 17:29 |  wangle100 
写的不错。
根据您提供的代码,我现在一个界面上显示两路rtsp流,程序后台会跑出“Caller uid=2000 is not privileged to communicate with the user=-2”,请问如何解决?
支持(0) 反对(0)
  
#3楼 [ 楼主2014-11-10 10:18 |  农民伯伯 
@ wangle100
不知道能不能同时播两路,这个你自己查一下,Vitamio是不支持的,不知道这个是否支持
支持(0) 反对(0)
  
#4楼   2014-11-10 15:05 |  wangle100 
@ 农民伯伯
谢谢啦。 近期找了一些资料,知道vlc是可以同时支持多路的,目前我正在测试vcl多路播放的性能。
支持(0) 反对(0)
  
#5楼   2014-11-14 21:01 |  LiuChunfu 
播放时候显示频谱或者柱形图,这个VLC提供API没有!?我发现我找不到!
支持(0) 反对(0)
  
#6楼   2015-01-17 16:30 |  insafe 
我下载了例子,但是放在andriod studio里面,不会编译,没有module,怎么做才能编译呀。
支持(0) 反对(0)
  
#7楼   2015-02-04 17:37 |  zhutousame 
我在eclipse下编译成功了,感谢楼主的帮助,这里附上编译过程

blog.csdn.net/zhutoubenben/article/details/43489001
支持(1) 反对(0)
  
#8楼   2015-02-10 09:57 |  小明去上学 
可以实现多路播放,但是要自己改源码。
支持(0) 反对(0)
  
#9楼   2015-03-09 22:55 |  simfe 
mark
支持(0) 反对(0)
  
#10楼   2015-04-09 21:02 |  luckyJMCC 
为什么我下载运行后一直是Hello World?
支持(0) 反对(0)
  
#11楼   2015-05-08 19:05 |  Caijw 
遇到一个问题 就是播放手机录制的视频, 系统自带的播放器是竖着满屏,官方的Demo 播放也是竖着的。 而自己写的播放是横着,你提供的Demo显示也是横着的, 显示在中间一块。 怎么解决这个问题。
支持(0) 反对(0)
  
#12楼 [ 楼主2015-05-11 17:52 |  农民伯伯 
@ Caijw
系统播放器的可能是读取的视频的旋转信息,我写的Demo没有做这方面的处理,你可以找找资料看看
支持(0) 反对(0)
  
#13楼   2015-05-22 11:32 |  widegalaxy 
大神,vlc android成功引入,现在做监控摄像头摄像显示测试,从服务器获取视频流,如何解决延迟高达2秒的问题?求教……
支持(0) 反对(0)
  
#14楼   2015-10-16 11:14 |  morning! 
@ 方方@鹏鹏
咋样,这个你做好了没,给我个demo 1927225864@qq.com,谢谢了大哥救命啊!
支持(0) 反对(0)
  
#15楼   2015-10-16 11:15 |  morning! 
@ widegalaxy
咋样,这个你做好了没,给我个demo 1927225864@qq.com,谢谢了大哥救命啊!
支持(0) 反对(0)
  
#16楼   2015-10-16 11:15 |  morning! 
@ 农民伯伯
咋样,这个你做好了没,给我个demo 1927225864@qq.com,谢谢了大哥救命啊!
支持(0) 反对(0)
  
#17楼   2015-10-16 11:15 |  morning! 
@ Caijw
咋样,这个你做好了没,给我个demo 1927225864@qq.com,谢谢了大哥救命啊!
支持(0) 反对(0)
  
#18楼   2015-10-16 11:15 |  morning! 
@ luckyJMCC
咋样,这个你做好了没,给我个demo 1927225864@qq.com,谢谢了大哥救命啊!
支持(0) 反对(0)
  
#19楼   2015-10-16 11:15 |  morning! 
@ simfe
咋样,这个你做好了没,给我个demo 1927225864@qq.com,谢谢了大哥救命啊!
支持(0) 反对(0)
  
#20楼   2015-10-16 11:39 |  morning! 
@ zhutousame
@小明去上学
咋样,这个你做好了没,给我个demo 1927225864@qq.com,谢谢了大哥救命啊!
支持(0) 反对(0)
  
#21楼   2015-10-16 11:40 |  morning! 
@ insafe
咋样,这个你做好了没,给我个demo 1927225864@qq.com,谢谢了大哥救命啊!
支持(0) 反对(0)
  
#22楼   2015-10-16 11:40 |  morning! 
@ LiuChunfu
咋样,这个你做好了没,给我个demo 1927225864@qq.com,谢谢了大哥救命啊!
支持(0) 反对(0)
  
#23楼   2015-10-16 11:40 |  morning! 
@ wangle100
咋样,这个你做好了没,给我个demo 1927225864@qq.com,谢谢了大哥救命啊!
支持(0) 反对(0)
  
#24楼   2015-10-16 11:40 |  morning! 
@ 农民伯伯
咋样,这个你做好了没,给我个demo 1927225864@qq.com,谢谢了大哥救命啊!
支持(0) 反对(0)
  
#25楼   2015-10-24 21:29 |  小强跑了 
我另外一个项目,手机有画面,很流畅,机顶盒有声音没画面,什么原因????
支持(0) 反对(0)
  
#26楼   2016-03-08 15:27 |  lion7beckham 
后面来学习~~
支持(0) 反对(0)
  
#27楼   2016-03-08 15:28 |  lion7beckham 
@ zhutousame
兄弟,这个链接404了,可否邮件发我个:lion7beckham@163.com
谢过啦!
支持(0) 反对(0)
  
#28楼   2016-04-19 23:11 |  Xanaduo 
无法播放啊,给你个地址试试。
http://vod.cntv.lxdns.com/flash/mp4video50/TMS/2016/04/19/f1db9354900946a19a7fefc3bf040593_h264200000nero_aac16.mp4
支持(0) 反对(0)
  
#29楼   2016-04-19 23:12 |  Xanaduo 
04-19 23:12:24.681 29630-8974/com.showbabyapp.myapplication E/VLC: core access: cannot resolve vod.cntv.lxdns.com port 80 : No address associated with hostname
04-19 23:12:24.681 29630-8974/com.showbabyapp.myapplication E/VLC: http access: cannot connect to vod.cntv.lxdns.com:80
04-19 23:12:24.682 29630-8974/com.showbabyapp.myapplication E/VLC: core access: cannot resolve vod.cntv.lxdns.com port 80 : No address associated with hostname
04-19 23:12:24.682 29630-8974/com.showbabyapp.myapplication E/VLC: access_mms access: cannot connect to vod.cntv.lxdns.com:80
04-19 23:12:24.682 29630-8974/com.showbabyapp.myapplication E/VLC: core input: open of ` http://vod.cntv.lxdns.com/flash/mp4video50/TMS/2016/04/19/f1db9354900946a19a7fefc3bf040593_h264200000nero_aac16.mp4' failed
04-19 23:12:24.682 29630-8974/com.showbabyapp.myapplication E/VLC: core input: Your input can't be opened
04-19 23:12:24.682 29630-8974/com.showbabyapp.myapplication E/VLC: core input: VLC is unable to open the MRL ' http://vod.cntv.lxdns.com/flash/mp4video50/TMS/2016/04/19/f1db9354900946a19a7fefc3bf040593_h264200000nero_aac16.mp4'. Check the log for details.
支持(0) 反对(0)
  
#30楼   2016-05-06 17:00 |  战儒小子 
楼主知道为什么我的页面需要将程序切到后台再切回来才能显示么?求助
支持(0) 反对(0)
  
#31楼   2016-08-15 11:39 |  438023135 
A component of name 'OMX.qcom.audio.decoder.aac' already exists, ignoring this one.
08-15 11:28:01.872 20066-4616/com.nmbb.vlc E/OMXNodeInstance: Unsupported omx error type(-2147479551), so it failed.
08-15 11:28:01.872 20066-4616/com.nmbb.vlc E/OMXNodeInstance: Unsupported omx error type(-2147479526), so it failed.
08-15 11:28:01.872 20066-4616/com.nmbb.vlc E/OMXNodeInstance: Unsupported omx error type(-2147479526), so it failed.
08-15 11:28:01.872 20066-4616/com.nmbb.vlc E/OMXNodeInstance: OMX_GetExtensionIndex OMX.google.android.index.storeMetaDataInBuffers failed

每次刚播放的时候,都会报这个错.然后导致会有卡顿现象.怎么解决?
支持(0) 反对(0)
  
#32楼   2016-09-20 14:48 |  袁仙人 
楼主,我把你提供的资源下载下来,整合到自己的工程中,结果出现问题如下,请问怎么解决;E/VLC/LibVLC: Can't load vlcjni library: java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.saiyimcu.vlctest-1/base.apk"],nativeLibraryDirectories=[/vendor/lib64, /system/lib64]]] couldn't find "libvlcjni.so"

解决方案:在jniLibs下的armeabi-v7a拷贝一份到libs目录下即可
支持(0) 反对(0)
  
#33楼   2016-09-22 09:11 |  袁仙人 
楼主,我这个显示不了视频,卡在了加载哪里;进入应用一直在加载 @农民伯伯
支持(0) 反对(0)
  
#34楼   2016-09-22 09:32 |  袁仙人 
@ zhutousame
404哦,能重新给个地址吗
支持(0) 反对(0)
  
#35楼   2017-02-28 09:20 |  one1go 
博主你好,在运行你的demo播放特定格式的mp4视频时,出现了
FATAL EXCEPTION: Thread-497
Process: com.nmbb.vlc, PID: 4156
java.lang.NoSuchMethodError: no method with name='eventHardwareAccelerationError' signature='()V' in class Lcom/nmbb/vlc/ui/VlcVideoActivity;
at dalvik.system.NativeStart.run(Native Method)
您觉得这是视频编解码的问题吗
支持(0) 反对(0)
  



这篇关于【VLC-Android】vlc-android简例——注意参考文献的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/680444

相关文章

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨削加工的精度。 转速范围 宽广的转速范围意味着平衡机能够处理更多种类的磨轮,适应不同的工作条件和规格要求。 振动监测能力 振动监测能力是评估平衡机性能的重要因素。通过传感器实时监

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

SpringMVC入参绑定特别注意

1.直接在controller中定义一个变量,但是此种传输方式有一个限制就是参数名和请求中的参数名必须保持一致,否则失效。 @RequestMapping("test2")@ResponseBodypublic DBHackResponse<UserInfoVo> test2(String id , String name){UserInfoVo userInfoVo = new UserInf

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

android应用中res目录说明

Android应用的res目录是一个特殊的项目,该项目里存放了Android应用所用的全部资源,包括图片、字符串、颜色、尺寸、样式等,类似于web开发中的public目录,js、css、image、style。。。。 Android按照约定,将不同的资源放在不同的文件夹中,这样可以方便的让AAPT(即Android Asset Packaging Tool , 在SDK的build-tools目

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使

Android Environment 获取的路径问题

1. 以获取 /System 路径为例 /*** Return root of the "system" partition holding the core Android OS.* Always present and mounted read-only.*/public static @NonNull File getRootDirectory() {return DIR_ANDR