腾讯云直播开发日记 (一) 直播播放和观看

腾讯云直播开发日记 (一)

视频直播这一两年在移动互联网上可以说是非常的火,各种视频直播软件层出不穷. 直播和短视频也变成了连体婴儿, 那么我们如何进行这种项目的开发呢? 如果自己实现 SDK 的话成本高, 技术难度大, 不过钱是万能的, 直接买, 不差钱。博主现在也是在一家电商直播的公司, 选择的就是腾讯的直播服务,官网文档写的一般, 比较官方,博主会根据开发经验写一些腾讯云直播相关的文章,避免采坑。

腾讯云直播产品介绍

首先腾讯云有解决方案,互动直播和通用视频,都是根据他们的产品组合来解决不同问题,也就是你直播是个服务得买,你短视频是个服务也得买,总而言之钱越多能解决的问题越多。那博主这边简单介绍一下这边的几个产品作用,大家可以根据业务选择

云直播

这个就是专门针对的直播的服务了,主播通过推流软件,推到腾讯这边,用户通过拉流地址进行拉流,就能看到画面,支持各种协议,多人互动 混流就行,高效解决直播延时等问题

云点播

直播之后,要看回放怎么办? 买这个,本地有视频想让用户看也能上传。结合云直播使用


服务端的话就介绍这个,根据业务选择解决方案,自己也可以选择不同服务。我们公司自己选的服务,我的IM没有用腾讯的

客户端SDK也得看看


移动直播 SDK

集多种SDK于一身, IM 直播 美颜等等 ,但是对应SDK的服务也是需要购买呢

腾讯有一个小直播的开源项目,方便开发者二开,只要开通对应服务就能快速搭建一个直播平台.

短视频 SDK

上传存储转码、分发的云点播能力,提供集成了采集剪辑拼接特效分享播放等功能的客户端SDK, 配合云点播

播放器 SDK

结合云点播直播服务,拥有流畅稳定的播放性能,可以做广告植入

美颜特效 SDK

美颜特效已集成到(移动直播/短视频)企业版 SDK 中, 如果你的产品做类似抖音这种短视频服务,发短视频的时候需要特性, 嘻嘻, 这个拍摄设置大眼、瘦脸、V 脸、下巴调整, 50W/年

直播接入步骤

我们需要直播自然要购买云直播,这个主要是购买流量包,新账号会送20G,可以进行测试, 进入控制台进行相关测试

域名管理

直播主要就是推流和拉流, 我们在这需要这个一个播放地址和推流地址, 这个设置文档上有 https://cloud.tencent.com/document/product/267/13551
配置完CNAME后需要几分钟,所以不要着急测试, CNAME 不成功是无法使用云直播的。

OBS +VLC 测试推拉流

然后我们测试一下推拉流是否正常,控制台有个 辅助工具 -> 地址生成器

obs推流.png

下载一个OBS的软件, 可以进行推流测试

  1. 设置
  2. 推流
  3. 服务选择自定义
  4. 服务器填写OBS推流地址
  5. 串流秘钥填写OBS推流名称
  6. 设置推流资源 可以是视频 也可以是图片
  7. 开始推流

推流OBS设置.png

下载VLC进行网络串流播放

在地址生成器那将推流的 StreamName 放进行生成播放地址, 直接利用 VLC 打开网络串就能看见直播了

vlc.png

这样就是可以正常推拉流了,也就是所谓的正常直播和观看,我们再往代码上落实一下。

使用php进行开发

我们需要建立一张 live_rooms 的数据表,初步定义字段完成主播的相关业务

参数名 说明
id 自增主建
user_id 用户ID
live_url 播放地址
obs_url 推流地址
avatar 直播封面
title 直播标题
status 直播状态 是否在播
  • php composer 安装一下 SDK tencentcloud/tencentcloud-sdk-php

云直播的相关配置放入服务端,服务端的可以在创建直播间的时候获取推流地址, 在用户进入直播间的时候获取拉流地址。

这样就可以做到主播开播出现在直播列表,用户进去观看主播, 根据这个之后我们可以再去扩展其他业务, 例如 区分主播类型是颜值的还是游戏的 附近主播 是不是还得加上经纬度 直播间里面要互动 肯定需要绑定聊天室 等等

这里推流地址需要 StreamName, 这个文档上也有说,就是标识不同直播间的,不能重复,我们也不需要去腾讯那边注册,直接拼接到推流地址里面, 我数据表里面并没有增加这个字段, 因为我直接用user_idStreamName, 如果你的推流地址中的StreamName相同,那么只有第一个开始推流的是有效的,也就是说同样的推流地址,谁先推谁的有效,拉流只能拉到第一个推流的那个。 特别在测试的时候, 测试数据库和正式用户id一样的话,你懂的.

/**
    * 获取推流地址
    * 如果不传key和过期时间,将返回不含防盗链的url
    *
    * @param string $streamName 您用来区别不同推流地址的唯一流名称
    * @return String url
    */
public static function getLiveStream($streamName)
{
    $time = time()+config('tencentcloud.invalid_time');
    $key = config('tencentcloud.tx_push_api_key');
    $txTime = strtoupper(base_convert($time,10,16));

    $txSecret = md5($key.$streamName.$txTime);

    $extStr = '?'.http_build_query([
            'txSecret' => $txSecret,
            'txTime' => $txTime
        ]);

    return "rtmp://".config('tencentcloud.push_domain')."/live/".$streamName . (isset($extStr) ? $extStr : "");
}

/**
    * 获取播放地址
    * 若开启了域名鉴权,实际过期时间等于 txTime + 鉴权有效时间。
    *
    * @param string $streamName 您用来区别不同推流地址的唯一流名称
    * @param string $playFormat 播放格式 有rtmp,FLV,HLS三种格式
    * @return String url
    */
public static function getPlayStream($streamName, $playFormat = 'rtmp')
{
    $time = time()+config('tencentcloud.invalid_time');
    $key = config('tencentcloud.tx_play_api_key');
    $txTime = strtoupper(base_convert($time,10,16));

    $txSecret = md5($key.$streamName.$txTime);

    $extStr = '?'.http_build_query([
            'txSecret' => $txSecret,
            'txTime' => $txTime
        ]);

    switch ($playFormat)
    {
        case 'flv':
            $playUrl = "http://".config('tencentcloud.play_domain')."/live/".$streamName .'.flv'. (isset($extStr) ? $extStr : "");
            break;

        case 'hls':
            $playUrl = "http://".config('tencentcloud.play_domain')."/live/".$streamName .'.m3u8'. (isset($extStr) ? $extStr : "");
            break;

        case 'rtmp':
        default:
            $playUrl = "rtmp://".config('tencentcloud.play_domain')."/live/".$streamName . (isset($extStr) ? $extStr : "");
            break;
    }

    return $playUrl;
}

其他业务场景下次再写啦!

您的支持是对我最大的鼓励!

发表于: 作者:憧憬。
关注互联网以及分享全栈工作经验的原创个人博客和技术博客,热爱编程,极客精神
Github 新浪微博 SegmentFault 掘金专栏