最近在百度搜了一下libvlc的截屏和录制视频功能,发现都是比较旧,不适合用,因此重新写一下截屏和录制视频功能这2个功能的实现。新版本的vlc源代码已经把截屏和录制视频功能实现,唯一是没有在libvlc把接口加上。
参考文章:
VLC for Android编译出AAR文件(https://blog.csdn.net/u010735007/article/details/108141213)
基于libvlc aar的android播放器实例(https://blog.csdn.net/u010735007/article/details/108168267)
基于libvlc aar的android播放器(点播与本地播放)(https://blog.csdn.net/u010735007/article/details/108424493)
基于libvlc aar的android截屏和录制视频功能(https://blog.csdn.net/u010735007/article/details/108517985)
android,ios,linux多平台libvlc api文档说明笔记(不断更新)(https://blog.csdn.net/u010735007/article/details/108198711)
一.录制视频功能
1.首先把0002和0005补丁打上,正常来说编译vlc的时候会打上,如果报错的话就手动打上,录制视频的功能就加上。
2.代码中最重要的地方
需要注销addOption(“:no-hw-dec”),这个行代码,不然播放过程中图像不会显示出来
public void setHWDecoderEnabled(boolean enabled, boolean force) {
...
else if (!enabled) ;/* LibVLC >= 4.0 */
//addOption(":no-hw-dec");
}
设置不要硬解后才可以录制和截屏成功,media.setHWDecoderEnabled(false, false);
Uri uri = Uri.parse("https://nclive.grtn.cn/gdws/sd/live.m3u8?_upt=051761c31599715809");//rtsp流地址或其他流地址
//final Media media = new Media(mLibVLC, getAssets().openFd(ASSET_FILENAME));
final Media media = new Media(mLibVLC, uri);
media.setHWDecoderEnabled(false, false);//设置后才可以录制和截屏
mMediaPlayer.setMedia(media);
media.release();
mMediaPlayer.play();
3.播放器里面录制功能实现
record.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (!isRecord) {
if (mMediaPlayer.record(Utils.getSDPath())) {//写到SDK里面
Toast.makeText(LiveActivity.this, "录制开始", Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(LiveActivity.this, "录制失败", Toast.LENGTH_SHORT).show();
}
isRecord = true;
record.setImageResource(R.drawable.recording);
}
else {
mMediaPlayer.record(null);//路径为null停止录制
Toast.makeText(LiveActivity.this, "录制结束", Toast.LENGTH_SHORT).show();
isRecord = false;
//finish();
record.setImageResource(R.drawable.record);
}
}
});
4.录制功能演示
生成文件如下
放到播放器上播放
5.录制功能接口位置
record方法在libvlc/src/org/videolan/libvlc/MediaPlayer.java里面
/**
* Start/stop recording
*
* @param directory path of the recording directory or null to stop
* recording
* @return true on success.
*/
//directory为存放的路径
public boolean record(String directory) {
return nativeRecord(directory);
}
nativeRecord方法在libvlc/jni/libvlcjni-mediaplayer.c里面
jboolean
Java_org_videolan_libvlc_MediaPlayer_nativeRecord(JNIEnv *env, jobject thiz, jstring jdirectory)
二.截屏功能
1.截屏功能libvlc里面是没有实现行数,只在vlc源代码里面实现,因此在libvlc里面实现截屏功能,然后编译通过即可
在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);
/* Get C string */
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);
return false;
}
在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);
2.代码中最重要的地方(重要的东西需要多说几次)
需要注销addOption(“:no-hw-dec”),这个行代码,不然播放过程中图像不会显示出来
public void setHWDecoderEnabled(boolean enabled, boolean force) {
...
else if (!enabled) ;/* LibVLC >= 4.0 */
//addOption(":no-hw-dec");
}
设置不要硬解后才可以录制和截屏成功,media.setHWDecoderEnabled(false, false);
Uri uri = Uri.parse("https://nclive.grtn.cn/gdws/sd/live.m3u8?_upt=051761c31599715809");//rtsp流地址或其他流地址
//final Media media = new Media(mLibVLC, getAssets().openFd(ASSET_FILENAME));
final Media media = new Media(mLibVLC, uri);
media.setHWDecoderEnabled(false, false);//设置后才可以录制和截屏
mMediaPlayer.setMedia(media);
media.release();
mMediaPlayer.play();
不设置上面代码会出现下面错误提示
com.android.vlcplayer E/VLC: [bc54e9b0/3b03] libvlc filter: Too high level of recursion (3)
com.android.vlcplayer E/VLC: [bc54e730/3b03] libvlc filter: Failed to create video converter
com.android.vlcplayer E/VLC: [bc6bf430/3b03] libvlc filter: Failed to create video converter
com.android.vlcplayer E/VLC: [bc441d30/3b03] libvlc video output: Failed to convert image for snapshot
3.播放器里面录制功能实现
if (mMediaPlayer.takeSnapShot(0, Utils.getSDPath(), 0, 0)) {
Toast.makeText(LiveActivity.this, "截图成功", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(LiveActivity.this, "截图失败", Toast.LENGTH_SHORT).show();
}
4.录制功能演示
生成文件如下
打开
具体的代码,大家可以下载,git地址:https://gitee.com/newpoyang/vlc-player,本人喜欢用码云,国内服务器比较快
如有用到此功能的朋友,可以留言交流和点赞