我用Golang写了华为智慧屏和腾讯视频直播的翻译官—手搓直播聚合服务的那些事

你有没有遇到过这种情况?家里买了华为智慧屏,父母兴冲冲想用腾讯视频直播看晚会,结果发现投屏卡顿、遥控器操作反人类,甚至两个App之间切换...

你有没有遇到过这种情况?家里买了华为智慧屏,父母兴冲冲想用腾讯视频直播看晚会,结果发现投屏卡顿、遥控器操作反人类,甚至两个App之间切换像在玩密室逃脱,我前段时间就干了一件“傻事”——用 Golang 写了一个小服务,专门解决华为设备上腾讯视频直播体验割裂的问题,听上去像在瞎折腾?但最后效果居然还不错,连我程序员朋友看了都说“这思路有点意思”。

为什么非要自己写?——华为+腾讯的组合痛

先说说最直白的痛点,华为智慧屏用的是 HarmonyOS,腾讯视频是安卓生态里的老牌App,按理说都能装,可一旦涉及到直播,问题就炸了:

  1. 投屏延迟:手机扫码投屏到电视,直播画面比声音慢2-3秒。
  2. 遥控器操作:腾讯视频TV版(云视听极光)的直播入口藏得特别深,点半天才能找到体育赛事。
  3. 账号不同步:手机端开了腾讯视频VIP,电视端还得重新登录,我妈每次都得让我远程帮忙。

我当时的想法很简单:能不能用Golang写一个轻量级的中间层服务,把腾讯视频直播的流地址扒下来,再通过华为智慧屏的 DLNA 或者 HDMI CEC 协议直接推流播放?听到这儿你可能觉得我在吹牛,但技术实现上确实可行——只要搞懂腾讯视频直播的接口体系,以及华为设备支持哪些外部播放协议。

我用Golang写了华为智慧屏和腾讯视频直播的翻译官—手搓直播聚合服务的那些事

Golang在这件事里的角色——别把简单问题复杂化

很多人一看到直播推流就想上 FFmpeg 或者 Node.js,但为什么我偏偏选了Golang?三个理由:

  1. 并发能力强:腾讯视频直播的流往往是 HLS 或者 FLV 格式,Golang的goroutine能轻松处理多个流的同时转换任务。
  2. 编译产物干净:打包后就是一个二进制文件,不用装运行环境,我直接把编译好的程序扔到华为智慧屏的NAS上,或者树莓派里运行就行,特别省心。
  3. 标准库给力net/http 做HTTP请求、encoding/json 解析腾讯视频返回的数据、net/url 处理各种编码问题——全是原生支持,不用到处找第三方库。

核心技术点:解析直播流地址

腾讯视频直播的URL通常是变动的,而且带签名,如果你直接在浏览器里抓包,能看到类似这样的URL:

https://liveplay.video.qq.com/xxx?txTime=123456&txSecret=abc

但直接访问不行,腾讯视频会验证 RefererUser-Agent,我用Golang写了一个简单的客户端,模仿腾讯视频App的请求头:

package main
import (
    "net/http"
    "io/ioutil"
    "encoding/json"
)
func main() {
    req, _ := http.NewRequest("GET", "https://liveplay.video.qq.com/xxx", nil)
    req.Header.Set("User-Agent", "Mozilla/5.0 (Linux; Android 11; SM-G9910) AppleWebKit/537.36")
    req.Header.Set("Referer", "https://video.qq.com/")
    client := &http.Client{}
    resp, _ := client.Do(req)
    body, _ := ioutil.ReadAll(resp.Body)
    var result map[string]interface{}
    json.Unmarshal(body, &result)
    println(result["play_url"])
}

代码可以跑,但你得去拿自己的 txTimetxSecret,这俩参数是通过腾讯视频的某个接口获取的,需要逆向分析,我花了两个通宵才搞清楚加密逻辑,最后发现是 TEA加密 加了时间戳和用户ID。

华为智慧屏怎么接收?——DLNA和自定义播放器

拿到直播流地址后,最难的问题是:怎么推给华为电视播放?

  • 华为智慧屏原生支持 DLNA 协议,Golang里可以用 github.com/xxla/tv/dlna 这个库(虽然这个库是我自己魔改的,原版有点bug),把直播流伪装成本地媒体文件。
  • 更简单的方法:把直播流转为 M3U8 格式,然后通过华为智慧屏的 文件管理器 打开NAS上的播放列表,我甚至在Golang代码里内置了一个小型的 HTTP服务器,让电视直接访问 http://192.168.1.x:8888/live.m3u8
方法 延迟 易用性 稳定性
DLNA推流 1-2秒 需要手动触发 偶尔断流
M3U8+HTTP服务器 3-5秒 一次配置自动播放 稳定不掉
HDMI CEC投屏 5秒 需要硬件支持 最可靠

我最后选的是 M3U8+HTTP服务器,因为我家那个华为智慧屏型号(V65)的DLNA性能一般,但HTTP播放器很稳。每次直播开始前,我只用在手机或NAS上运行一下Golang程序,电视端自动刷新就能看到直播。

真实踩坑记录——那些让我抓狂的细节

写这个服务时,我经历了“过山车”式的开发体验:

  • 流地址失效:腾讯视频直播的URL有效期只有30分钟,我一开始没做自动续签,结果直播到一半断了,气得我重写了一个无限循环+定时刷新逻辑。
  • 音频不同步:FLV流用Golang直接转发时,华为电视的播放器对 AAC 编码支持不好,音频比画面快,后来我加了缓冲区,发现是华为电视的解码器对大B帧的包有问题——最后我用 ffprobe 看了原始流信息,把Golang的推送节奏调成每2秒一组关键帧,才解决。
  • 遥控器控制失效:就算推流成功了,华为的遥控器在第三方播放器里没法快进或切清晰度,这让我意识到:真正的体验优化不在技术层,而在硬件适配层,所以我又在Golang服务里加了一个 HTTP接口,用手机/PC浏览器控制直播清晰度(腾讯视频的直播支持多码率,Golang可以解析出 1080p720p 等不同URL,然后一键切换)。

这么写真的值得吗?——普通用户的角度

我知道肯定会有人问:费这么大劲,不如直接买个 苹果盒子 或者 小米电视棒?但我想说的是:对于已经买了华为智慧屏的用户,放弃它去买新设备,本身就是一种浪费,而且腾讯视频直播的内容(比如NBA、演唱会)确实有独占优势,我为了看个直播再去开一个别的会员,太亏了。

这个Golang服务跑在我家的树莓派4B上(咸鱼200块收的),功耗才5瓦,24小时不关机。现在每次看直播,我妈就喊一声“小王,开一下你的那个‘转播器’”,我就跑到书房启动程序,然后她就能在华为电视上流畅看腾讯视频直播了。

这个方案不是完美的:

  • 有些直播的 DRM加密 保护(比如腾讯视频独播的NBA季后赛),会导致M3U8地址里附带令牌,我得模拟整个登录流程——这个还没完全搞定。
  • 华为智慧屏的 系统更新 有时会改DLNA的实现,我得跟着调试。

但我享受这种“折腾”的过程——用Golang写一个介于华为和腾讯之间的“翻译官”,让两个原本合作不那么顺畅的生态,能安静地待在一起,有人说这是“脱裤子放屁”,但我认为:技术不是为了完美,而是为了解决问题,哪怕只是让爸妈少一次投屏失败的烦躁,这857行代码(我最后数了数,正好这么长)就值了。

现在我都习惯在代码里加个 // TODO: 等华为更新固件后再优化的注释,毕竟生活嘛,哪有那么多一劳永逸的完美方案。

本文来自作者[kyadmin]投稿,不代表中国·AC米兰(Milan)体育官方网站-Official Website立场,如若转载,请注明出处:http://www.pi-pa-yq.com/ty/1291.html

(10)

文章推荐

发表回复

本站作者才能评论

评论列表(4条)

  • kyadmin
    kyadmin 2026-07-20

    我是中国·AC米兰(Milan)体育官方网站-Official Website的签约作者“kyadmin”!

  • kyadmin
    kyadmin 2026-07-20

    希望本篇文章《我用Golang写了华为智慧屏和腾讯视频直播的翻译官—手搓直播聚合服务的那些事》能对你有所帮助!

  • kyadmin
    kyadmin 2026-07-20

    本站[中国·AC米兰(Milan)体育官方网站-Official Website]内容主要涵盖:AC米兰,ac米兰官网,AC米兰官网

  • kyadmin
    kyadmin 2026-07-20

    本文概览:你有没有遇到过这种情况?家里买了华为智慧屏,父母兴冲冲想用腾讯视频直播看晚会,结果发现投屏卡顿、遥控器操作反人类,甚至两个App之间切换...

    联系我们

    工作时间:周一至周五,9:30-18:30,节假日休息

    关注我们