基于libvlc aar的android截屏和录制视频功能

最近在百度搜了一下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,本人喜欢用码云,国内服务器比较快


如有用到此功能的朋友,可以留言交流和点赞

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
Android 上使用 libvlc 播放视频文件非常简单。libvlc 是一个强大的开源多媒体框架,它支持几乎所有常见的视频和音频格式。 首先,需要将 libvlc 添加到 Android 项目中。可以通过在项目的 build.gradle 文件中添加以下代码来实现: ```groovy dependencies { implementation 'org.videolan.android:libvlc-all:3.3.0' } ``` 在需要使用 libvlc 的 Activity 中,需要先初始化 libvlc。可以在 onCreate 方法中添加以下代码: ```java LibVLC libVLC = new LibVLC(); ``` 接下来,需要创建一个SurfaceView来显示视频。可以在布局文件中添加一个SurfaceView视图: ```xml <SurfaceView android:id="@+id/surfaceView" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 然后,在 Activity 中获取 SurfaceView 并设置播放器使用它来显示视频: ```java SurfaceView surfaceView = findViewById(R.id.surfaceView); IVLCVout ivlcVout = libVLC.getVLCVout(); ivlcVout.setVideoView(surfaceView); ivlcVout.attachViews(); ``` 最后,需要创建一个 MediaPlayer 实例来控制视频的播放。可以在 Activity 的 onCreate 方法中添加以下代码: ```java String filePath = "/path/to/video/file"; MediaPlayer mediaPlayer = new MediaPlayer(libVLC); mediaPlayer.setMedia(Uri.parse(filePath)); ``` 现在,可以使用 MediaPlayer 对象来控制视频的播放。例如,可以调用 mediaPlayer.play() 方法来开始播放视频。 当不需要播放视频时,可以释放 MediaPlayer 和 libvlc 资源,以释放内存和资源: ```java mediaPlayer.release(); libVLC.release(); ``` 以上就是如何在 Android 上使用 libvlc 播放视频文件的简单步骤。通过使用 libvlc,我们可以轻松实现高度定制的视频播放器,并支持各种视频格式和功能
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值