请问View上面有直播之死亡设计师全文直播吗?

仿映客 viewPager 上下滑动切换直播 - DiyCode
经过几天对映客APP的分析研究,明白了映客上下滑动切换新的直播的实现原理,真心觉得做的挺赞的。。还是很流畅的,性能也很不错。相较于研究过的其他的美颜直播APP,我觉的效果没有这个好。 项目地址是
欢迎大家star,fork,或者提意见啦
预览图效果比较差,gif图有些模糊,所以最好是运行下面的apk文件
首先是一个主Activity,里面只有一个ViewPager,当然了这个viewPager得是VerticalViewPager的。可以参考这两个项目 ,
, 请记住ViewPager使用的adapter得是PagerAdapter,而不能是FragmentPagerAdapter
class PagerAdapter extends android.support.v4.view.PagerAdapter {
public int getCount() {
return mVideoUrls.size();
public boolean isViewFromObject(View view, Object object) {
return view == object;
public Object instantiateItem(ViewGroup container, int position) {
View view = LayoutInflater.from(container.getContext()).inflate(R.layout.view_room_item, null);
view.setId(position);
container.addView(view);
return view;
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(container.findViewById(position));
大致上就是这样的。 view_room_item.xml的布局,其实很简单,就是一个临时的布局,而不是我们真实的布局,贴一下布局代码吧
&?xml version="1.0" encoding="utf-8"?&
&FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"&
&ImageView
android:id="@+id/anchor_img"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg_room_change"
android:scaleType="fitXY" /&
&/FrameLayout&
至于我们的真实业务的布局在哪呢,我们接下来会说道。viewPager上下切换中,创建的都是这个假的临时的布局,而且在整个viewPager起作用的过程中,始终就只有这一个真实业务的布局,viewPager默认会加载三个view,另外两个view都是假的,或者说是临时的view,在这里,真实业务的布局就是我们的聊天室,以及texttureview
view_room_container.xml (真实的业务布局)
&?xml version="1.0" encoding="utf-8"?&
&RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/room_container"
android:layout_width="match_parent"
android:layout_height="match_parent"&
&com.pili.pldroid.player.widget.PLVideoTextureView
android:id="@+id/texture_view"
android:layout_width="match_parent"
android:layout_height="match_parent" /&
&FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent" /&
&/RelativeLayout&
我们是在什么地方把真实业务布局添加到viewPager中呢,可以看下面的一段代码
mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
Log.e(TAG, "mCurrentId == " + position + ", positionOffset == " + positionOffset +
", positionOffsetPixels == " + positionOffsetPixels);
mCurrentItem = position;
mViewPager.setPageTransformer(false, new ViewPager.PageTransformer() {
public void transformPage(View page, float position) {
ViewGroup viewGroup = (ViewGroup) page;
Log.e(TAG, "page.id == " + page.getId() + ", position == " + position);
if ((position & 0 && viewGroup.getId() != mCurrentItem)) {
View roomContainer = viewGroup.findViewById(R.id.room_container);
if (roomContainer != null && roomContainer.getParent() != null && roomContainer.getParent() instanceof ViewGroup) {
((ViewGroup) (roomContainer.getParent())).removeView(roomContainer);
// 满足此种条件,表明需要加载直播视频,以及聊天室了
if (viewGroup.getId() == mCurrentItem && position == 0 && mCurrentItem != mRoomId) {
if (mRoomContainer.getParent() != null && mRoomContainer.getParent() instanceof ViewGroup) {
((ViewGroup) (mRoomContainer.getParent())).removeView(mRoomContainer);
loadVideoAndChatRoom(viewGroup, mCurrentItem);
loadVideoAndChatRoom(viewGroup, mCurrentItem)这个方法做的就是添加直播视频和聊天室到当前选中的view中
在PageTransformer里面,我们需要判断,每时每刻都只有一个真实业务的view,具体的判断条件可以参考这个demo,也可以自己做实验印证,主要的思路还是当滑动停止下来后,transformPage()方法中,当前选中的view的position==0,这个条件成立开始加载直播视频和聊天室的,而view不是我们选中的view的时候,也就是position & 0 && viewGroup.getId() != mCurrentItem 需要移除之前的真实业务布局。具体可以看上面的代码
整体而言就是ViewPager加载的三个view中,有且只有一个view是拥有视频播放的textureview的,以及聊天室的fragment的,另外两个view都只是显示背景,没有其他的作用,在整个activity的生命过程中,始终只有这一个textutreview以及一个聊天室的fragment的,永远是复用的。这种情况下,就需要自己来控制不出现错位,混乱的问题,对映客的这种方式表示吊吊的 ^_^
由于时间仓促,目前并未模拟出真实的聊天室功能。以及网络请求这块也并未加上,还需要进一步完善。
大致原理就是如此了,请运行demo尝试吧,有疑问请提issue或者在diycode下面评论啊。
视频播放使用的是 ,感觉用起来还是不错的
上下滑动选用的是 ,没有选择另外一个的原因是,当滑动到顶部或者是底部的时候,滑动的产生的波纹效果还是左右方向的
其实 你写的比他们的都好
多谢夸奖啊。 这个还可以进一步完善的,这样还是太demo化了
请问要做成无限循环切换 ,切换动画里的判断要怎么做! 急
楼主,方便加下QQ吗???
有问题请教关于直播间上下滑动切换的
我的qq是,或者给下你的qq,先谢谢了。
麻烦问下有没有实现无限循环切换?
后方可回复, 如果你还没有账号请点击这里 。
共收到 6 条回复时间: October 20, 2017
之前还留有一个问题,这次也会再留一个问题。。:2.一进去第一次的onPageChange不调用这个问题到是好解决,很简单。 因为是viewpager的第一个fragment,那么肯定会被初始化,肯定会调用fragment的onActivityCreated方法,在里面直接做观看页面的初始化即可。然后现在又出现了两个问题:1.在fragment里添加了surfaceview来显示视频,结果视频画面时有时无,声音正常(可以判定视频加载肯定没问题,肯定出在surfaceview上)2.viewpager在切换fragment的时候,会卡那么一下(待解决。。和视频没关系,应该是观看界面里UI布局初始化的问题)第一个问题折腾了一天,偶然百度发现有人说fragment里的surfaceview有声音无画面。按照他的做了发现并没用。然后还有文章介绍。这篇文章给了启示,话说surfaceview的surfaceholder也是有生命周期的啊!也能添加Callback。只有使出最后的大招,打日志!在fragment和surfaceholder的生命周期里打满了日志,发现(还记得前面在setLiveActive里处理逻辑么)setLiveActive和surfaceholder的生命周期先后顺序不对。推断应该是surfaceholder还并未初始化完成,然后在setLiveActive调用了播放设置holder,这样当然是出现没画面有声音。所以在surfaceChanged和setLiveActive里同时去判断surfaceholder是否有创建即可,因为回调都是在UI线程因此是顺序的,所以用一个surfaceCreated变量来互斥,这样就能确保总能正确的只设置一次surfaceholder。因此有了下面代码:
override fun surfaceChanged(holder: SurfaceHolder?, format: Int, width: Int, height: Int) {
&=====$this=========surfaceChanged&
if (surfaceCreated){
surfaceCreated = true
if (isActive){
(activity as WatchActivity).mediaPlayer?.setDisplay(holder)
(activity as WatchActivity).mediaPlayer?.dataSource = &rtmp://live.hkstv.hk.lxdns.com/live/hks&
(activity as WatchActivity).mediaPlayer?.prepareAsync()
和在setLiveActive也判断一下是否创建:
if (surfaceCreated){
(activity as WatchActivity).mediaPlayer?.setDisplay(surfaceView.holder)
(activity as WatchActivity).mediaPlayer?.dataSource = &rtmp://live.hkstv.hk.lxdns.com/live/hks&
(activity as WatchActivity).mediaPlayer?.prepareAsync()
抛开fragment,视频就能流畅的切换了!毫无卡顿!!================再次回来================坑了坑了。。简单的按照之前的做。是有问题的。1.滑动时不灵活,因为有个fakeDragBy导致2.和子布局的横向滑动(向右滑动隐藏布局。)冲突。又看了下映客的,向上或向下翻页时,整个布局会有个向右的几个像素移动。试了试我自己的也是这样。因为向右滑动是计算偏移,而开始翻页时手指有一定横向的偏移,这时横向滑动和纵向滑动事件同时进行就出现了这种情况。3.viewpager里放的并不是fragment,而是View,造成实现逻辑太复杂,全放view里。做个简单的demo看似没问题,真正实现起来还是挺复杂不好处理。那么新的方案:1.翻页还是用verticalViewPager,verticalViewPager其实是支持fragmentadapter的(因为他就是作者从源码考出来,把X Y互换而已),因此使用fragment管理布局,显得简单。2.向右滑动隐藏布局,则是fragment里再放一个viewpager。这个viewpager里放2个fragment(一个空白的,一个直播布局的)。这样组合使用就又能翻页还能右滑隐藏拉。当然,还有两个问题:1.viewpager并没有回调和接口获取当前选中的fragment,其他的fragment的生命周期,只有个onPageChange(position)。可以说里面的生命周期就是乱乱的。onresume、onStop各种有时调有时不掉。2.一进去第一次的onPageChange不调用的(待解决。。),这个问题我觉得应该无伤大雅。。再想办法解决方案:在adapter里重写instantiateItem和destroyItem,使用hashmap将position和fragment保存/删除。在onPageChange里根据position获取当前的fragment,然后遍历其他fragment进行相应处理(setLiveActive方法里处理)。上代码:1.这是adapterclass VerticalViewPagerAdapter2(fragmentManager:
FragmentManager):FragmentPagerAdapter(fragmentManager), AnkoLogger {
var rooms : ArrayList&Room&? = null
var fragmentCache: HashMap&Int, WatchFragment& = HashMap()
override fun getItem(position: Int): Fragment {
return WatchFragment.newInstance(rooms!![position], position)
override fun getCount(): Int {
return rooms?.size!!
override fun instantiateItem(container: ViewGroup?, position: Int): Any {
val fragment = super.instantiateItem(container, position)
fragmentCache.put(position, fragment as WatchFragment)
return fragment
override fun destroyItem(container: ViewGroup?, position: Int, `object`: Any?) {
super.destroyItem(container, position, `object`)
fragmentCache.remove(position)
}}2.这是activity
adapter = VerticalViewPagerAdapter2(supportFragmentManager)
adapter?.rooms = ArrayList()
adapter?.rooms!!.add(Room(&&, &1166666&, &&, &1& ,&&,&8731&,&1&,&1166666&,&&))
adapter?.rooms!!.add(Room(&&, &3236114&, &&, &1& ,&&,&8731&,&2&,&3236114&,&&))
verticalViewPager.adapter = adapter
verticalViewPager.overScrollMode = View.OVER_SCROLL_NEVER
verticalViewPager.setOnPageChangeListener(object : ViewPager.SimpleOnPageChangeListener() {
//当页面滚动完成时会调用此方法
override fun onPageSelected(position: Int) {
super.onPageSelected(position)
adapter?.fragmentCache?.filterKeys {
it != position
}?.forEach{
it.value.setLiveActive(false)
adapter?.fragmentCache!![position]?.setLiveActive(true)
=====================可耻=============目前在做一个直播项目,正好用到这个效果。根据网上其他人的文章以及我自己测试了下,基本验证了映客上下滑动切换直播使用的是竖向viewpager。而万能的github上有一个老胸已经实现了竖向的viewpager(反正我写不出哈哈):然后给篇文章告诉怎么使用:我准备写个测试demo,发现他判断当前直播有点复杂,稍微做了点改进,。同时也发现了一个问题,当用手指触摸屏幕不松开拖动,直到下一页完全出现,然后放手是不会触发pageTransformer的,因此就不会进行直播间的切换。做了常规的测试目前没发现问题,如果大家发现问题欢迎沟通,以下是代码(kotlin写的,LivingView里面就一个textview显示状态),仅供参考:
verticalViewPager.setOnPageChangeListener(object : ViewPager.SimpleOnPageChangeListener() {
//当页面滚动完成时会调用此方法
override fun onPageSelected(position: Int) {
super.onPageSelected(position)
verticalViewPager.post {
//在这里面模拟一个假的拖动动作,只滚动1像素,触发下面的pageTransformer
//因为只有在pageTransformer中才能获取到当前显示的几个view
if(verticalViewPager.beginFakeDrag()){
info{ &fake drag& }
verticalViewPager.fakeDragBy(1f)
verticalViewPager.endFakeDrag()
verticalViewPager.setPageTransformer(false) { page, _ -&
val viewGroup = page as ViewGroup
val roomContainer = viewGroup as LivingView
//根据tag与当前选中页比较判断选中哪一个直播,然后进行相应逻辑
if (viewGroup.tag != verticalViewPager.currentItem) {
roomContainer.setText(&不是直播&)
roomContainer.setText(&正在直播&)
添加新评论
: 你的插件是从哪里下载的。我之前是直接github拉的master...
: 大佬,我也是测试邮件发送是好的,评论里却收不到邮件。求问怎么解决,谢谢
: 你好之前用的七牛的SDK,后来发现七牛的SDK各种崩溃、对RTM...
: 用的七牛的SDK。
: 你好,请问一下,加载视频的时候您是用到了什么框架?十分感谢
: 谢谢正好用到2089人阅读
音视频(31)
一、直播现状简介
1.技术实现层面:
技术相对都比较成熟,设备也都支持硬编码。IOS还提供现成的 Video ToolBox框架,可以对摄像头和流媒体数据结构进行处理,但Video ToolBox框架只兼容8.0以上版本,8.0以下就需要用x264的库软编了。
github上有现成的开源实现,推流、美颜、水印、弹幕、点赞动画、滤镜、播放都有。技术其实不是很难,而且现在很多云厂商都提供SDK,七牛云、金山云、乐视云、腾讯云、百度云、斗鱼直播伴侣推流端,功能几乎都是一样的,没啥亮点,不同的是整个直播平台服务差异和接入的简易性。后端现在 RTMP/HTTP-FLV 清一色,App挂个源站直接接入云厂商或CDN就OK。
2.直播优化层面
其实最难的难点是提高首播时间、服务质量即Qos(Quality of Service,服务质量),如何在丢包率20%的情况下还能保障稳定、流畅的直播体验,需要考虑以下方案:
1.为加快首播时间,收流服务器主动推送 GOP :(Group of Pictures:策略影响编码质量)所谓GOP,意思是画面组,一个GOP就是一组连续的画面至边缘节点,边缘节点缓存 GOP,播放端则可以快速加载,减少回源延迟
2.GOP丢帧,为解决延时,为什么会有延时,网络抖动、网络拥塞导致的数据发送不出去,丢完之后所有的时间戳都要修改,切记,要不客户端就会卡一个 GOP的时间,是由于 PTS(Presentation Time Stamp,PTS主要用于度量解码后的视频帧什么时候被显示出来) 和 DTS 的原因,或者播放器修正 DTS 和 PTS 也行(推流端丢GOD更复杂,丢 p 帧之前的 i 帧会花屏)
3.纯音频丢帧,要解决音视频不同步的问题,要让视频的 delta增量到你丢掉音频的delta之后,再发音频,要不就会音视频不同步
4.源站主备切换和断线重连
5.根据TCP拥塞窗口做智能调度,当拥塞窗口过大说明节点服务质量不佳,需要切换节点和故障排查
6.增加上行、下行带宽探测接口,当带宽不满足时降低视频质量,即降低码率
7.定时获取最优的推流、拉流链路IP,尽可能保证提供最好的服务
8.监控必须要,监控各个节点的Qos状态,来做整个平台的资源配置优化和调度
直播过程.3
9.如果产品从推流端、CDN、播放器都是自家的,保障 Qos 优势非常大
10.当直播量非常大时,要加入集群管理和调度,保障 Qos
11.播放端通过增加延时来减少网络抖动,通过快播来减少延时。(出自知乎宋少东)。
3.运营成本和客户体验
根据网上的数据,斗鱼 TV 为 3 亿人民币,战旗 TV 为 1.5 亿人民币,龙珠为 1.2 亿人民币,虎牙为 3000 万 + 人民币。
运营和推广:这个就比较烧钱了,一些做移动直播、游戏直播、秀场直播的A轮至少得上千万。
用户体验:流畅、不卡顿、不花屏、断线重连、丢包策略、首画加载速度、丰富的礼物系统,为了提高用户体验,可以在后台加载其他页面数据,但要在用户体验和内存优化方面找到平衡点。
二、流媒体传输
1.TCP:TCP为点对点的协议,虽然能保证了数据传输的可靠性,但是对服务器资源耗费较大,在数据流大的场合难以保证数据流传输的实时性。
2.UDP:UDP为不可靠传输协议,不需要维护连接状态,也不认为每个数据包都必须到达接受端,因此网络负荷比TCP小,传输速度也要比TCP快;但在网络越拥挤时,越有更多的数据包丢失。
3.RTMP:RTMP一个专门为高效传输视频,音频和数据而设计的协议。它通过建立一个二进制TCP连接或者连接HTTP隧道实现实时的视频和声音传输。
4.FFmpeg:FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案
协议差异.4
三、项目搭建:采集端
1.目前比较知名的有VideoCore
目前国内很多知名的推流框架都是对VideoCore的二次开发。这个框架主要使用C++写的,支持RTMP推流,但对于iOS开发者来说有点晦涩难懂(精通C++的除外)。想开源和免费的可以选择现在的几个知名项目VideoCore + GPUImage+基于GPU的美颜滤镜 ,播放用IJKPlayer自己修改。
2.国内比较火的LiveVideoCoreSDK
框架提供IOS苹果手机的RTMP推流填写RTMP服务地址,直接就可以进行推流,SDK下载后简单的工程配置后能直接运行,实现了美颜直播和滤镜功能,基于OpenGL,前后摄像头随时切换,提供RTMP连接状态的回调。
这个框架是国内比较早的一款推流框架有不少在使用这个SDK,功能非常齐全,作者也比较牛,用来学习推流采集相关内容非常好,但是集成到工程中有些困难(对于我来说)。总的来说这是一款非常厉害的推流SDK,几乎全部使用C++写的,编译效率非常好,如果有实力的话推荐使用这个框架来做自己项目的推流端。
3.可读性比较好的推流LFLiveKit
框架支持RTMP(Real Time Messaging Protocol ):实时消息传输协议,Adobe公司的。
HlS (HTTP Live Streaming) :苹果自家的动态码率自适应技术。主要用于PC和Apple终端的音视频服务。包括一个m3u(8)的索引文件,TS媒体分片文件和key加密串文件。
推荐这个框架第一是因为它主要使用OC写的,剩下的用C语言写的,框架文件十分清晰,这对不精通C++的初学者提供了很大的便利,并且拓展性非常强,支持动态切换码率功能,支持美颜功能。
4.美颜功能
美颜的话一般都是使用的GPUImage基于OpenGl开发,纯OC语言,这个框架十分强大,可以做出各种不同滤镜,可拓展性高。如果对美颜没有具体思路可以直接用BeautifyFace,可以加入到项目中,很方便的实现美颜效果。
四、项目具体搭建
1.如何实现美颜?
美颜功能使用的是BeautifyFace,它可以很快速的实现美颜功能,效果不错,它的底层还是基于的GPUImage,对GPUImage十分喜爱的Developer,可以参照BeautifyFace,写出一个属于自己的美颜功能,并且添加各种滤镜。
2.悬浮TabBar的实现
这个TabBar看着像是用自定义TabBar做的,但事实上它还是用的系统的TabBar,给系统的tabBar.backgroundImage设置一张设计好的背景图片。
添加后会发现顶部有一条阴影线,并且TabBar的高度也不够。阴影线与上图绿色线条之间变成了透明颜色,实现下面方法隐藏阴影线,并且调高TabBar的高度。
[[UITabBar appearance] setShadowImage:[UIImage new]];
- (void)setupTabBarBackgroundImage {
UIImage *image = [UIImage imageNamed:@"tab_bg"];
CGFloat top = 40;
CGFloat bottom = 40 ;
CGFloat left = 100;
CGFloat right = 100;
UIEdgeInsets insets = UIEdgeInsetsMake(top, left, bottom, right);
UIImage *TabBgImage = [image resizableImageWithCapInsets:insets resizingMode:UIImageResizingModeStretch];
self.tabBar.backgroundImage = TabBgI
[[UITabBar appearance] setShadowImage:[UIImage new]];
[[UITabBar appearance] setBackgroundImage:[[UIImage alloc]init]];
- (void)viewWillLayoutSubviews {
CGRect tabFrame = self.tabBar.frame;
tabFrame.size.height = 60;
tabFrame.origin.y = self.view.frame.size.height - 60;
self.tabBar.frame = tabF
3.播放端的实现
播放端用的针对RTMP优化过的ijkplayer(),ijkplayer是基于FFmpeg的跨平台播放器,这个开源项目已经被多个 App 使用,其中映客、美拍和斗鱼使用了 ijkplayer(5700+) 。在本文的末未提供了,已经打包好的ijkplayer,直接拖入项目就可以使用。省去了编译的过程(编译十分麻烦,并且容易出错)。播放端调用ijkplayer参考VoideSun的简仿映客所写,如有关于ijkplayer的问题,可以请教这位大牛。
- (void)goPlaying {
self.url = [NSURL URLWithString:_liveUrl];
_player = [[IJKFFMoviePlayerController alloc] initWithContentURL:self.url withOptions:nil];
UIView *playerview = [self.player view];
UIView *displayView = [[UIView alloc] initWithFrame:self.view.bounds];
self.PlayerView = displayV
[self.view addSubview:self.PlayerView];
playerview.frame = self.PlayerView.bounds;
playerview.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[self.PlayerView insertSubview:playerview atIndex:1];
[_player setScalingMode:IJKMPMovieScalingModeAspectFill];
4.推送端的实现
使用的是LFLiveKit,推流端可以选择很多GitHub上的开源项目替代LFLiveKit,比如上面所提到的VideoCore,和LiveVideoCoreSDK。商用的话可以选择各大厂商的SDK,网易直播云、七牛、腾讯、百度、新浪、其中金山直播云本人用过。使用直播云的好处就是能快速上线App,功能十分齐全,可以播放器和推流端,服务器一套下来,有专业客服人员帮助集成到工程中,缺点就是流量费太贵了,具体可以了解下各大厂商的收费标准。
- (UIButton*)startLiveButton{
if(!_startLiveButton){
_startLiveButton = [UIButton new];
_startLiveButton.frame = CGRectMake((XJScreenW - 200) * 0.5, XJScreenH - 100, 200, 40);
_startLiveButton.layer.cornerRadius = _startLiveButton.frame.size.height * 0.5;
[_startLiveButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[_startLiveButton.titleLabel setFont:[UIFont systemFontOfSize:16]];
[_startLiveButton setTitle:@"开始直播" forState:UIControlStateNormal];
[_startLiveButton setBackgroundColor:[UIColor grayColor]];
_startLiveButton.exclusiveTouch = YES;
__weak typeof(self) _self = self;
[_startLiveButton addBlockForControlEvents:UIControlEventTouchUpInside block:^(id sender) {
_self.startLiveButton.selected = !_self.startLiveButton.selected;
if(_self.startLiveButton.selected){
[_self.startLiveButton setTitle:@"结束直播" forState:UIControlStateNormal];
LFLiveStreamInfo *stream = [LFLiveStreamInfo new];
stream.url = @"rtmp://daniulive.com:1935/live/stream238";
[_self.session startLive:stream];
[_self.startLiveButton setTitle:@"开始直播" forState:UIControlStateNormal];
[_self.session stopLive];
return _startLiveB
stream.url是服务器的地址,推流完成后使用VLC播放。别人家的服务器,不建议推流时间过长(& 1分钟),建议搭建自己的RTMP服务器,详情请见我的另一篇简书文章。
项目地址520Linkee:/
给没架设服务器的朋友来一套福利:备用服务器地址(亲测可用):
rtmp://live.hkstv.hk.lxdns.com:1935/live/stream123
rtmp://live.hkstv.hk.lxdns.com:1935/live/hks
(将hks名称改成其他的,比如aaa)
rtmp://202.69.69.180:443/live/aaa
(rtmp://202.69.69.180:443/webcast/bshdlive-pc)
rtmp://v1.one-tv.com:1935/live/aaa(rtmp://v1.one-tv.com:1935/live/mpegts.stream)
rtmp://203.207.99.19:1935/live/aaa(rtmp://203.207.99.19:1935/live/CCTV1)
rtmp://202.117.80.19:1935/live/aaa
(rtmp://202.117.80.19:1935/live/live4)
rtmp://ams.studytv.cn/live/aaa
(rtmp://ams.studytv.cn/livepkgr/264)
rtmp://60.174.36.89:1935/live/aaa
(rtmp://60.174.36.89:1935/live/vod3)}

我要回帖

更多关于 直播之死亡设计师免费 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信