前言

  继续折腾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可能老变,大家看文章的时候注意一下版本问题。

转载于:https://www.cnblogs.com/over140/p/3932784.html

【VLC-Android】vlc-android简例相关推荐

  1. 【流媒体开发】VLC Media Player - Android 平台源码编译 与 二次开发详解 (提供详细800M下载好的编译源码及eclipse可调试播放器源码下载)

    作者 : 韩曙亮  博客地址 : http://blog.csdn.net/shulianghan/article/details/42707293 转载请注明出处 : http://blog.csd ...

  2. Android RuntimePermissions运行时权限:单个运行时权限申请简例

    Android RuntimePermissions运行时权限:单个运行时权限申请简例 Android运行时权限申请的框架结构和步骤比较简单和固定,一般现状代码启动后检查当前的Android SDK版 ...

  3. Android VLC音频视频播发器快速集成教程与模块

    前言 通过该文,你能很简单的知道怎么使用vlc,并且通过封装好的方法,很简单的几句代码就能实现音频视频本地与在线播放. 转载请务必注明出处:http://blog.csdn.net/u01461403 ...

  4. Android SurfaceView简例

    Android SurfaceView简例 Android中各的SurfaceView和View有很大的不同,两者应用场景不同.大多数View能做的事情SurfaceView也可以,但是Surface ...

  5. cygwin 编译 android vlc,Cygwin 编译 VLC 问题

    Cygwin 编译 VLC 遇到了这么多问题,不过还好最后编译过去了. 问题 1: gcc -mno-cygwin -Wsign-compare -Wall -mms-bitfields -pipe ...

  6. Android VLc编译

    配置环境变量: export MY_HOME=/home/luolicai/work/android_buildexport JAVA_HOME=${MY_HOME}/jdk-11.0.17 expo ...

  7. Android NDK基础样例

    Android NDK基础样例 NDK(Native Development Kit),用C/C++封装一些东西?好像就这么理解好了== 一.环境准备 这个好讨厌==!因为我环境都已经搭了很久了. 已 ...

  8. android 仿简书评论,Android 开发仿简书登录框可删除内容或显示密码框的内容

    简书App 是我很喜欢的一款软件.今天就模仿了一下他的登录框.先上图: 好了下面上代码,自定义ImgEditText 继承与EditText.重写一些方法. package lyf.myimgedit ...

  9. Android点击按钮显示密码,Android 开发仿简书登录框可删除内容或显示密码框的内容...

    简书App 是我很喜欢的一款软件.今天就模仿了一下他的登录框.先上图: 好了下面上代码,自定义ImgEditText 继承与EditText.重写一些方法. package lyf.myimgedit ...

  10. Qualcomm Android camera 架构简析及如何debug

    一. Camera模组(CCM)介绍: CCM一般包含四大件: 镜头(lens).传感器(sensor).软板(FPC).图像处理芯片(DSP):     Camera的成像原理可以简单概括如下: 1 ...

最新文章

  1. 【感悟随笔】没能变强是因为你太贪图舒服了
  2. 如何让castle用connectionstring里的连接字符串?
  3. 常系数线性递推的第n项及前n项和(转载)
  4. python 遍历usb设备_python程序员教你写脚本玩微信跳一跳,只要有耐心,你就是王者!...
  5. 车辆撞人有全险但是是全责,车主不愿出钱垫付医药费,该怎么办?
  6. kotlin 对话框_使用Kotlin的Android警报对话框
  7. linux准备环境,组建自己的Linux-01准备环境
  8. GD32实战6__串口读写
  9. 儿童python编程教程-一款儿童编程入门的理想工具——PythonTurtle
  10. 谈一谈百度 科大讯飞 云知声的语音合成功能
  11. Flutter 判断网络可用性
  12. 为互联网IT人打造的中文版awesome-go
  13. 未完成:读书笔记01芝加哥大学论文写作指南_Kate L. Turabian
  14. Xcode Warning: “no rule to process file
  15. CC2530的中断操作----按键控制led灯亮灭
  16. 正则表达式:邮箱匹配
  17. 图片数据增强的方法——收藏
  18. 《计算机应用》期刊投稿经验
  19. FFmpeg合并音频文件和视频文件
  20. 微信公众号--根据用户opneId获取用户信息

热门文章

  1. phpstorm-有关设置
  2. IntelliJ IDEA 快捷键(一)(window版)
  3. 2017南宁现场赛E 存档
  4. Tomcat的类加载器
  5. SQL Server调优系列玩转篇三(利用索引提示(Hint)引导语句最大优化运行)
  6. JavaFX学习之Web
  7. Win7下提取加密PDF文件(pdf加密成exe)
  8. 序列化 - 实现ISerializable
  9. Qt-捕获Windows消息
  10. 关于winodows下编程c++遇到的引用文件路径问题