基于loongnix20系统,libvlc代码直接集成测试

1、简单使用:

  这个网上例程也比较多,这里直接贴上一个博客链接:Linux 下使用libvlc 播放视频 C++,在此感谢作者耿明岩的付出。 直接在龙芯系统里照着做就完事。这里踩了个坑,就是准备了一个wmv格式的视频,无法播放,换另一个MOV就可以了。

2、代码集成:

因方法1还不满足需求。所以接下来继续做。
我的demo目录是:/home/abdu/package,直接借用上述链接中的demo.cpp,见最后。也附上可直接使用的代码包demo下载

sudo apt install vlc
sudo apt install libvlc-dev
sudo apt install libvlccore-dev

将上述“1、简单使用”中编译生成的可执行文件,拷贝到/home/abdu/package,可以看到demo所以依赖的库如下:

[abdu@abdu-pc:~/package]$ ldd demo
	linux-vdso.so.1 (0x000000fffe03c000)
	libvlc.so.5 => /lib/loongarch64-linux-gnu/libvlc.so.5 (0x000000fff521c000)
	libvlccore.so.9 => /lib/loongarch64-linux-gnu/libvlccore.so.9 (0x000000fff50f4000)
	libstdc++.so.6 => /lib/loongarch64-linux-gnu/libstdc++.so.6 (0x000000fff4f38000)
	libm.so.6 => /lib/loongarch64-linux-gnu/libm.so.6 (0x000000fff4e6c000)
	libgcc_s.so.1 => /lib/loongarch64-linux-gnu/libgcc_s.so.1 (0x000000fff4e08000)
	libc.so.6 => /lib/loongarch64-linux-gnu/libc.so.6 (0x000000fff4c64000)
	libpthread.so.0 => /lib/loongarch64-linux-gnu/libpthread.so.0 (0x000000fff4c30000)
	/lib64/ld.so.1 (0x000000fff527ec68)
	libidn.so.11 => /lib/loongarch64-linux-gnu/libidn.so.11 (0x000000fff4bf4000)
	libdl.so.2 => /lib/loongarch64-linux-gnu/libdl.so.2 (0x000000fff4be8000)
	libdbus-1.so.3 => /lib/loongarch64-linux-gnu/libdbus-1.so.3 (0x000000fff4b78000)
	libsystemd.so.0 => /lib/loongarch64-linux-gnu/libsystemd.so.0 (0x000000fff4ac0000)
	librt.so.1 => /lib/loongarch64-linux-gnu/librt.so.1 (0x000000fff4ab0000)
	liblzma.so.5 => /lib/loongarch64-linux-gnu/liblzma.so.5 (0x000000fff4a7c000)
	liblz4.so.1 => /lib/loongarch64-linux-gnu/liblz4.so.1 (0x000000fff4a54000)
	libgcrypt.so.20 => /lib/loongarch64-linux-gnu/libgcrypt.so.20 (0x000000fff4970000)
	libgpg-error.so.0 => /lib/loongarch64-linux-gnu/libgpg-error.so.0 (0x000000fff4940000)

有点多,可以利用一下脚本进行拷贝,脚本内容如下:

#!/bin/bash
LibDir=$PWD"/lib"
Target=$1
lib_array=($(ldd $Target | grep -o "/.*" | grep -o "/.*/[^[:space:]]*"))
$(mkdir $LibDir)
for Variable in ${lib_array[@]}
do
   cp "$Variable" $LibDir
done

对应的库拷贝到/home/abdu/package/lib/下:

[abdu@abdu-pc:~/package]$ ./copylib.sh demo
[abdu@abdu-pc:~/package]$ ls lib/
ld.so.1    libdbus-1.so.3  libgcc_s.so.1    libgpg-error.so.0  liblz4.so.1   libm.so.6        librt.so.1      libsystemd.so.0  libvlc.so.5
libc.so.6  libdl.so.2      libgcrypt.so.20  libidn.so.11       liblzma.so.5  libpthread.so.0  libstdc++.so.6  libvlccore.so.9

继续拷贝程序执行需要的其他库和插件:

cp -rf /usr/lib/loongarch64-linux-gnu/vlc lib/

执行以下更新插件:

./lib/vlc/vlc-cache-gen lib/vlc/plugins/

拷贝编译需要的头文件:

mkdir include
cp -rf /usr/include/vlc include

至此所需依赖都准备完毕。

卸载之前安裝的系统库:

sudo apt remove libvlc-dev
sudo apt remove libvlccore-dev
sudo apt remove vlc
sudo apt autoremove

代码修改:

修改程序中的头文件包含:
demo.cpp

#include <vlc/vlc.h>  改为:  #include "include/vlc/vlc.h"

/home/abdu/package/include/vlc/vlc.h 改成以下:

#include "../../include/vlc/libvlc.h"
#include "../../include/vlc/libvlc_renderer_discoverer.h"
#include "../../include/vlc/libvlc_media.h"
#include "../../include/vlc/libvlc_media_player.h"
#include "../../include/vlc/libvlc_media_list.h"
#include "../../include/vlc/libvlc_media_list_player.h"
#include "../../include/vlc/libvlc_media_library.h"
#include "../../include/vlc/libvlc_media_discoverer.h"
#include "../../include/vlc/libvlc_events.h"
#include "../../include/vlc/libvlc_dialog.h"
#include "../../include/vlc/libvlc_vlm.h"
#include "../../include/vlc/deprecated.h"

这时候如果编译会报找不到 -lvlc 和 -lvlccore,需要以下操作:

cd lib
ln -s libvlc.so.5 libvlc.so
ln -s libvlccore.so.9 libvlccore.so
cd ..

至此操作基本结束。

编译:

 g++ -o demo  demo.cpp -lvlc -lvlccore -L /home/abdu/package/lib/

执行:

执行之前需要设置一些环境变量可以借助脚本执行,必须设置依赖路径,否则会报段错误:

#!/bin/sh
VLC_PLUGIN=$PWD/lib/vlc/plugins
echo $VLC_PLUGIN
export VLC_PLUGIN_PATH=$VLC_PLUGIN
 
LIBRARY_PATH=$PWD/lib/:$PWD/lib/vlc/
echo $LIBRARY_PATH
export LD_LIBRARY_PATH=$LIBRARY_PATH

VLC_INCLUDE=$PWD/include/
echo $VLC_INCLUDE
export CPLUS_INCLUDE_PATH=$VLC_INCLUDE
 
./demo

demo.cpp如下:

//#include <vlc/vlc.h>
#include <unistd.h>
#include "include/vlc/vlc.h"

int main(void){
    //VLC 播放器实例(可以理解成VLC引擎)
    libvlc_instance_t * inst;
    //VLC 媒体播放器(播放视频时控制, 播放、暂停、停止、音量...)
    libvlc_media_player_t * vlc_player = NULL;
    //播放视频来源,和视频文件的信息(本地视频文件,网络视频文件,RTSP...)
    libvlc_media_t * vlc_media = NULL;
    //初始化VLC引擎
    inst = libvlc_new (0, NULL);
    //指定本地根目录下/test.mp4为视频来源,请按实际路径指定,可以去https://www.haolizi.net/example/view_20786.html下载各种格式测试视频
    vlc_media = libvlc_media_new_path(inst, "/home/abdu/kuaishan.MOV");
    //创建VLC视频播放器,根据vlc_media
    vlc_player = libvlc_media_player_new_from_media(vlc_media);
    //以下代码暂时不使用vlc_media指针了,所以提前释放了
    libvlc_media_release (vlc_media);
    //设置播放容器,0x4800006并不是死值,这是X11的窗口ID,下边简单说一下获取窗口ID方法
    //也可以不调用此方法,或者窗口ID参数处也可以随意填写一个int值, VLC已做判断,没有找不到指定窗口ID时或没设置窗口ID时都会创建一个窗口播放视频
    //首次调用建议先不要调用此api
    libvlc_media_player_set_xwindow(vlc_player, 0x4800006);
    //libvlc_media_player_set_xwindow(vlc_player, 0x2c00006);
    //播放视频,返回0 表示已开始播放,非0表示播放失败
    int result = libvlc_media_player_play(vlc_player);
    //睡1秒,如果不睡,在后续调用libvlc_media_player_is_playing时会返回0(0:当前未播放, 1:正在播放)!!!,应该是播放视频也需要一些时间,1秒足够
    //不一定必须睡一秒,对libvlc api还不是特别的解,如果您对libvlc非常了解,不要参考此处...
    sleep(1);
    //设置音量,可以发现在控制视频时都需要用到vlc_player指针
    libvlc_audio_set_volume(vlc_player, 50);
    //循环判断当前视频是否是播放状态
    while(libvlc_media_player_is_playing(vlc_player)){
        sleep(1);
    }
    //播放完毕,释放播放器
    libvlc_media_player_release (vlc_player);
    //释放引擎
    libvlc_release (inst);
    return 0;
}

后记问题记录:

问题1:
只有声音,没有视频播放:

[000000ffbc02f690] main video output error: video output creation failed
[000000ffe40963b0] main decoder error: failed to create video output
[h264 @ 0xffe40b5030] get_buffer() failed
[h264 @ 0xffe40b5030] thread_get_buffer() failed
[h264 @ 0xffe40b5030] decode_slice_header error
[h264 @ 0xffe40b5030] no frame!

原因缺少libplacebo.so.7
解决:
在LIBRARY_PATH多增加一个路径$PWD/lib/vlc/

问题2:
代码执行会报以下错误,虽然程序也能执行.

00000001265ba040] main libvlc error: stale plugins cache: modified /home/abdu/package/lib/vlc/plugins/video_output/libglconv_vaapi_wl_plugin.so
[00000001265ba040] main libvlc error: stale plugins cache: modified /home/abdu/package/lib/vlc/plugins/video_output/libglconv_vaapi_x11_plugin.so
[00000001265ba040] main libvlc error: stale plugins cache: modified /home/abdu/package/lib/vlc/plugins/video_output/libglconv_vdpau_plugin.so
[00000001265ba040] main libvlc error: stale plugins cache: modified /home/abdu/package/lib/vlc/plugins/video_output/libgles2_plugin.so
[00000001265ba040] main libvlc error: stale plugins cache: modified /home/abdu/package/lib/vlc/plugins/video_output/libglx_plugin.so
[00000001265ba040] main libvlc error: stale plugins cache: modified /home/abdu/package/lib/vlc/plugins/video_output/libwl_shell_plugin.so
[00000001265ba040] main libvlc error: stale plugins cache: modified /home/abdu/package/lib/vlc/plugins/video_output/libwl_shm_plugin.so
[00000001265ba040] main libvlc error: stale plugins cache: modified /home/abdu/package/lib/vlc/plugins/video_output/libxcb_window_plugin.so
[00000001265ba040] main libvlc error: stale plugins cache: modified /home/abdu/package/lib/vlc/plugins/video_output/libxcb_x11_plugin.so
[00000001265ba040] main libvlc error: stale plugins cache: modified /home/abdu/package/lib/vlc/plugins/video_output/libxcb_xv_plugin.so
[00000001265ba040] main libvlc error: stale plugins cache: modified /home/abdu/package/lib/vlc/plugins/video_output/libxdg_shell_plugin.so

解决:

./lib/vlc/vlc-cache-gen lib/vlc/plugins/

问题3:

[000000ffb8189690] chain filter error: Too high level of recursion (3)
[000000ffb81832d0] main filter error: Failed to create video converter
[000000ffb8189690] chain filter error: Too high level of recursion (3)
[000000ffb8189690] chain filter error: Too high level of recursion (3)
[000000ffb81832d0] main filter error: Failed to create video converter

这个问题主要是vlc-plugin-video-output导致,可以看到这个库安装之后,用到了vlc下面的库:

[abdu@abdu-pc:~/package]$ cat /var/lib/dpkg/info/vlc-plugin-video-output\:loongarch64.list 
/.
/usr
/usr/lib
...
/usr/lib/loongarch64-linux-gnu/vlc/libvlc_vdpau.so
/usr/lib/loongarch64-linux-gnu/vlc/libvlc_vdpau.so.0
/usr/lib/loongarch64-linux-gnu/vlc/libvlc_xcb_events.so
/usr/lib/loongarch64-linux-gnu/vlc/libvlc_xcb_events.so.0

解决办法:同问题1.
在LIBRARY_PATH多增加一个路径$PWD/lib/vlc/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值