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 发送点播插件。

libvlc 使用mediaplayer 播放rtsp_第1张图片

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

//查找一下 

libvlc 使用mediaplayer 播放rtsp_第2张图片

}

所有 描述为 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 播放

你可能感兴趣的:(vlc,live555,rtsp)