【VLC-Android】vlc-android简例——注意参考文献
来源:互联网 发布:什么是java跨域 编辑:程序博客网 时间:2024/05/21 01:46
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; @Override protected 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"); } @Override public void onPause() { super.onPause(); if (mMediaPlayer != null) { mMediaPlayer.stop(); mSurfaceView.setKeepScreenOn(false); } } @Override protected void onDestroy() { super.onDestroy(); if (mMediaPlayer != null) { mMediaPlayer.eventVideoPlayerActivityCreated(false); EventHandler em = EventHandler.getInstance(); em.removeHandler(mVlcHandler); } } @Override public void onConfigurationChanged(Configuration newConfig) { setSurfaceSize(mVideoWidth, mVideoHeight, mVideoVisibleWidth, mVideoVisibleHeight, mSarNum, mSarDen); super.onConfigurationChanged(newConfig); } @Override public void surfaceCreated(SurfaceHolder holder) { if (mMediaPlayer != null) { mSurfaceHolder = holder; mMediaPlayer.attachSurface(holder.getSurface(), this); } } @Override public 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; } } @Override public void surfaceDestroyed(SurfaceHolder holder) { if (mMediaPlayer != null) { mMediaPlayer.detachSurface(); } } @Override public 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() { @Override public 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() { @Override public 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 size int dw = getWindowManager().getDefaultDisplay().getWidth(); int dh = getWindowManager().getDefaultDisplay().getHeight(); // calculate aspect ratio double ar = (double) mVideoWidth / (double) mVideoHeight; // calculate display aspect ratio double dar = (double) dw / (double) dh; switch (mCurrentSize) { case SURFACE_BEST_FIT: if (dar < ar) dh = (int) (dw / ar); else dw = (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); else dw = (int) (dh * ar); break; case SURFACE_4_3: ar = 4.0 / 3.0; if (dar < ar) dh = (int) (dw / ar); else dw = (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可能老变,大家看文章的时候注意一下版本问题。
评论:
根据您提供的代码,我现在一个界面上显示两路rtsp流,程序后台会跑出“Caller uid=2000 is not privileged to communicate with the user=-2”,请问如何解决?
不知道能不能同时播两路,这个你自己查一下,Vitamio是不支持的,不知道这个是否支持
谢谢啦。 近期找了一些资料,知道vlc是可以同时支持多路的,目前我正在测试vcl多路播放的性能。
blog.csdn.net/zhutoubenben/article/details/43489001
系统播放器的可能是读取的视频的旋转信息,我写的Demo没有做这方面的处理,你可以找找资料看看
咋样,这个你做好了没,给我个demo 1927225864@qq.com,谢谢了大哥救命啊!
咋样,这个你做好了没,给我个demo 1927225864@qq.com,谢谢了大哥救命啊!
咋样,这个你做好了没,给我个demo 1927225864@qq.com,谢谢了大哥救命啊!
咋样,这个你做好了没,给我个demo 1927225864@qq.com,谢谢了大哥救命啊!
咋样,这个你做好了没,给我个demo 1927225864@qq.com,谢谢了大哥救命啊!
咋样,这个你做好了没,给我个demo 1927225864@qq.com,谢谢了大哥救命啊!
@小明去上学
咋样,这个你做好了没,给我个demo 1927225864@qq.com,谢谢了大哥救命啊!
咋样,这个你做好了没,给我个demo 1927225864@qq.com,谢谢了大哥救命啊!
咋样,这个你做好了没,给我个demo 1927225864@qq.com,谢谢了大哥救命啊!
咋样,这个你做好了没,给我个demo 1927225864@qq.com,谢谢了大哥救命啊!
咋样,这个你做好了没,给我个demo 1927225864@qq.com,谢谢了大哥救命啊!
兄弟,这个链接404了,可否邮件发我个:lion7beckham@163.com
谢过啦!
http://vod.cntv.lxdns.com/flash/mp4video50/TMS/2016/04/19/f1db9354900946a19a7fefc3bf040593_h264200000nero_aac16.mp4
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.
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
每次刚播放的时候,都会报这个错.然后导致会有卡顿现象.怎么解决?
解决方案:在jniLibs下的armeabi-v7a拷贝一份到libs目录下即可
404哦,能重新给个地址吗
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)
您觉得这是视频编解码的问题吗
- 【VLC-Android】vlc-android简例——注意参考文献
- 【VLC-Android】vlc-android简例
- 【VLC-Android】vlc-android简例
- 【VLC-Android】vlc-android简例
- 【VLC-Android】vlc-android简例
- 【VLC-Android】vlc-android简例
- VLC-ANDROID
- 【VLC-Android】Mac下编译vlc-android
- VLC on Android
- vlc-android编译流程
- vlc-android编译流程
- vlc android 移植
- Android VLC的编译
- Android VLC 编译问题
- Android Vlc编译
- vlc android 代码编译
- vlc-android编译流程
- VLC Android录制视频
- thinkphp学习教程笔记1-请求和响应
- shell 中字符串的拼接
- this 的三种用法
- jsp页面数据回显(select下拉选择框)
- oracle帮助文档——Database Utilities
- 【VLC-Android】vlc-android简例——注意参考文献
- php生成0~1随机小数方法
- 求数组中最大值
- buff系统设计
- oracle帮助文档——Database Security Guide
- oracle中查询中文字段查询不出的问题
- java中栈 堆 寄存器 静态变量 和常量内存解析
- 斐波那契查找(黄金分割法查找)(仅使用加减实现的二分查找)
- jQuery源码分析----数据缓存系统