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/