libvlc 使用mediaplayer 播放rtsp
环境 ubuntu18.04 vlc3.0.6源码
从 github上下载的vlc 源码,默认配置,默认编译,用命令
./vlc rtsp://192.168.43.129:10086/stream
竟然无法播放,但是直接./vlc test.mp4 用 修改 vlc.c 里的main函数替换成用 vlm推送rtsp流, 都可行。
现象:
[00007fe66c001670] satip stream error: Failed to setup RTSP session
问题排除
1: 用wind上的vlc搭建rtsp推流,同时用wind上另一个 vlc播放rtsp ok. (推送端 rtsp正常)
2:ubuntu上关掉防火墙 #ufw disable #ufw status (ok已关闭)
3:卸载掉自己编译的vlc ,删除掉 user~.config/vlc 重新用 apt-get install vlc, 安装vlc, 还是老问题,似乎重新安装的过程有些毛病。 目的是使用 默认安装的vlc 执行上述的命令来确认系统网络正常,但是没有达到目的 。
4:直接从源码处查看具体问题。。。。。(头大)
5:用wireshark抓包分析
直接就 setup ,连 option 请求都没有,果然是有问题的。
6 运行源码编译出来的vlc, vlc --list 列举出可以加载的插件模块,发现是没有rtsp的接受端支持的,只有rtsp 发送点播插件。
7.0 configure --help
默认是不支持 realrtsp的。找到原因了,重新配置源码,./configure --enable-realrtsp --enable-live555。
8.0 不过我的configure 打开live555,configure 是失败的,提示live555不存在或者过老,需要自己更新
9.0 https://wiki.videolan.org/UnixCompile#The_method_for_badly-behaved_distributions
类似于ubuntu 编译libvlc,你需要下载各种依赖代码的源码,操作方法如上官方介绍 (速度奇慢,还会碰到 从谷歌仓库下载 aom(支持av1的解码开源项目),当然下不到,导致失败)
隔天再次分析出错的信息,上述第4 条,如果上述的配置 ./configure --enable-realrtsp --enable-live555 ,只开启realrtsp而disable-live555 ,也会报错。在access.c文件中的
access_new()
{
access->p_module = module_need(access, "access", access->psz_name,
true);
//上面输出一下 pszname , 输出结果为 :rtsp,也就要加载一个rtsp的access
//查找一下
}
所有 描述为 rtsp的模块,并且能力为access的,有:
1.0 access/rtsp/access.c 2.0 access/live555.cpp 3.0 access/satip.c
上述wireshark抓包只有一个 setup的,就是匹配到 satip.c模块,出错,然后继续匹配 到 access/rtsp/access.c,结果这个模块发生未知错误加载失败,猜测这个可能已经抛弃,使用的 live555,但是这里没有。。。。。。
安装live555, 上面第9条,vlc官方提供的方法,但是安装又有问题,头文件找不到,编译不过,干脆自行下载一个live555,
http://www.live555.com/liveMedia/public/
#cd live
#./genMakefiles linux-64bit
#make
#make install
如果不行,手动拷贝一下上面的make install 中安装的文件到 contrib/x86_64-linux-gnu/
嫌麻烦可以 export DESTDIR =XXXanzhuangmulu
#make install
最终程序:
正常安装好live555, 在vlc顶层目录下 重新配置 ./configure --enable-realrtsp --enable-live555 ,执行编译 #make
使用./vlc rtsp://192.168.43.129:10086/stream 播放pc端vlc搭建的服务器rtsp流,播放ok!
环境就绪,现改用mediaplayer 播放rtsp。
在 bin/vlc.c 源码vlc入口函数,用我们自己的 main函数来替换掉源码的main函数,这样demo头文件和环境之类可以保持正确
自己的main代码
int main()
{
/* The so-called POSIX-compliant MacOS X reportedly processes SIGPIPE even
* if it is blocked in all thread.
* Note: this is NOT an excuse for not protecting against SIGPIPE. If
* LibVLC runs outside of VLC, we cannot rely on this code snippet. */
signal (SIGPIPE, SIG_IGN);
/* Restore SIGCHLD in case our parent process ignores it. */
signal (SIGCHLD, SIG_DFL);
#ifndef NDEBUG
/* Activate malloc checking routines to detect heap corruptions. */
setenv ("MALLOC_CHECK_", "2", 1);
/* Disable the ugly Gnome crash dialog so that we properly segfault */
setenv ("GNOME_DISABLE_CRASH_DIALOG", "1", 1);
#endif
#ifdef TOP_BUILDDIR
setenv ("VLC_PLUGIN_PATH", TOP_BUILDDIR"/modules", 1);
setenv ("VLC_DATA_PATH", TOP_SRCDIR"/share", 1);
#endif
/* Clear the X.Org startup notification ID. Otherwise the UI might try to
* change the environment while the process is multi-threaded. That could
* crash. Screw you X.Org. Next time write a thread-safe specification. */
unsetenv ("DESKTOP_STARTUP_ID");
libvlc_instance_t *vlc;
libvlc_media_player_t *media_player;
libvlc_media_t *media;
vlc = libvlc_new(0, NULL);
if(vlc == NULL)
{
printf("wang erro libvlc_new \n");
return -1;
}
media_player = libvlc_media_player_new(vlc);
#if 1
media = libvlc_media_new_location(vlc,"rtsp://192.168.43.233:8989/stream");
#else
media = libvlc_media_new_path(vlc,"bydtest.mp4");
libvlc_media_add_option(media, ":sout=#duplicate{dst=rtp{sdp=rtsp://:10086/stream},dst=display}");
#endif
if(media_player == NULL || media == NULL)
{
printf("wang erro new_media_player \n");
return -1;
}
libvlc_media_player_set_media(media_player,media);
libvlc_media_player_play(media_player);
//注意release , 测试代码,没处理
//play 30s
//usleep(10000*100*30);
while(1); //主线程不能退出,不然子线程也挂掉,播放不了了
libvlc_vlm_release(vlc);
return 0;
}
#endif
主要步骤
vlc = libvlc_new(0, NULL);
media_player = libvlc_media_player_new(vlc); //创建 media_player
media = libvlc_media_new_location(vlc,"rtsp://192.168.43.233:8989/stream"); //创建media
libvlc_media_player_set_media(media_player,media);//设置media到mediaplayer
libvlc_media_player_play(media_player);//mediaplayer 播放
推荐阅读
-
android使用surfaceview+MediaPlayer播放视频
-
使用Gin+WebSocket在HTML中无插件播放RTSP
-
Android 使用mediaplayer播放res/raw文件夹中的音乐的实例
-
libvlc 使用mediaplayer 播放rtsp
-
解决Android使用MediaPlayer只播放视频不播放音频的方法
-
Android 使用mediaplayer播放res/raw文件夹中的音乐的实例
-
使用Gin+WebSocket在HTML中无插件播放RTSP
-
Android 之 使用MediaPlayer播放音频
-
解决Android使用MediaPlayer只播放视频不播放音频的方法