原文链接: https://blog.youkuaiyun.com/qw345/article/details/122252489
Demo参考
你可以选择两种方式集成到项目中。项目地址:https://github.com/spiritedRunning/VLCLibClient
1. 源码+so
添加一个android library, 注意包名一定要和JNI的签名匹配,不能修改
并将libvlc目录下的源码文件拷贝到创建的工程中, 下图高亮部分
并把编译好的lib库放到对应目录
2. aar集成
或者直接集成aar到项目中
截图
libvlc默认是不带截图功能的,需要手动添加代码
在/libvlc/src/org/videolan/libvlc/MediaPlayer.java
中添加
//参数number:视频标识(默认为0),path:存放的路径,width:视频宽(为0时代表原始宽),height:高(为0时代表原始高)
public boolean takeSnapShot(int number, String path, int width, int height) {
return nativeTakeSnapShot(number, path, width, height);
}
private native boolean nativeTakeSnapShot(int number, String path, int width, int height);
在/libvlc/jni/libvlcjni-mediaplayer.c
中增加实现
jboolean
Java_org_videolan_libvlc_MediaPlayer_nativeTakeSnapShot(JNIEnv *env, jobject thiz,jint number, jstring path, jint width, jint height)
{
vlcjni_object *p_obj = VLCJniObject_getInstance(env, thiz);
const char* psz_path = (*env)->GetStringUTFChars(env, path, 0);
int res = libvlc_video_take_snapshot(p_obj->u.p_mp, (int)number,psz_path , (int)width,(int)height);
if(res == 0) return true;
LOGE("libvlc_video_take_snapshot(%s,%d)", psz_path, res);
if (psz_path)
{
(*env)->ReleaseStringUTFChars(env, path, psz_path);
}
return false;
}
并且代码中要设置不开启硬解,才能截图和录制
然后要注销掉setHWDecoderEnabled方法中的addOptions, 否则播放会有问题
录制
需要手动添加上下面两个patch
重新编译生成so库放到项目中
效果展示
代码也比较简单,不出意外的话,可以显示出截图和录制了
同时可以尝试调整参数来调节播放的流畅度
ArrayList<String> args = new ArrayList<>();
args.add("--rtsp-tcp"); //强制rtsp-tcp,加快加载视频速度
args.add("--live-caching=0");
args.add("--file-caching=0");
args.add("--network-caching=200");
libVlc = new LibVLC(this, args);
测试
可用的rtsp 测试地址:
rtsp://rtsp.stream/movie
rtsp://rtsp.stream/pattern
https://github.com/RSATom/rtsp-test-server