当前位置: 首页 > news >正文

直播录屏技术揭秘:以抖音直播录屏为例

一、引言:直播录屏的价值与挑战

想必你看过了很多直播录屏软件的介绍,他们要不全是广告推广,要不就是好几年前的软件了,有没有人维护还两说,他们不会告诉你为什么你用的时候要么断线,要么花屏,要么录制不完全,今天我就直播录制的核心技术来给大家讲解下,以后遇到问题也可以自己分析和解决了。

直播录屏大家用来最多的可能就是直播切片或者复盘学习了,一些场观10万+的直播,其话题度和热度能持续带来不少的热度,而且通过切片带货,不少小博主也能赚到不少生活费,因此,直播录制的热度长盛不衰。

然鹅,直播的实时性很高,对稳定性要求很严格,它不像下电影一下,还可以暂停等会再接着下,直播错过就没了,如果中间卡顿或者丢帧,有可能导致整个直播录制结果文件不可用,因此,直播录制的稳定性至关重要。

下面以大家常用的抖音为例,讲解如何录制抖音直播间。


二、直播录制的核心技术原理
  1. 直播数据流捕获层
    • 视频流捕获:通常根据输入的抖音直播间地址,获取到房间号,然后通过官方接口获取直播流。
      抖音的爬取比较简单,关键代码如下所示:
async def get_douyin_app_stream_data(url: str, proxy_addr: OptionalStr = None, cookies: OptionalStr = None) -> dict:headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0','Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2','Referer': 'https://live.douyin.com/'}if cookies:headers['Cookie'] = cookiesasync def get_app_data(room_id: str, sec_uid: str) -> dict:app_params = {"verifyFp": "verify_lxj5zv70_7szNlAB7_pxNY_48Vh_ALKF_GA1Uf3yteoOY","type_id": "0","live_id": "1","room_id": room_id,"sec_user_id": sec_uid,"version_code": "99.99.99","app_id": "1128"}api2 = f'https://webcast.amemv.com/webcast/room/reflow/info/?{urllib.parse.urlencode(app_params)}'json_str2 = await async_req(url=api2, proxy_addr=proxy_addr, headers=headers)json_data2 = json.loads(json_str2)['data']room_data2 = json_data2['room']room_data2['anchor_name'] = room_data2['owner']['nickname']return room_data2try:web_rid = url.split('?')[0].split('live.douyin.com/')if len(web_rid) > 1:web_rid = web_rid[1]params = {"aid": "6383","app_name": "douyin_web","live_id": "1","device_platform": "web","language": "zh-CN","browser_language": "zh-CN","browser_platform": "Win32","browser_name": "Chrome","browser_version": "116.0.0.0","web_rid": web_rid}api = f'https://live.douyin.com/webcast/room/web/enter/?{urllib.parse.urlencode(params)}'json_str = await async_req(url=api, proxy_addr=proxy_addr, headers=headers)json_data = json.loads(json_str)['data']room_data = json_data['data'][0]room_data['anchor_name'] = json_data['user']['nickname']else:data = await get_sec_user_id(url, proxy_addr=proxy_addr)if data:_room_id, _sec_uid = dataroom_data = await get_app_data(_room_id, _sec_uid)else:unique_id = await get_unique_id(url, proxy_addr=proxy_addr)return await get_douyin_stream_data(f'https://live.douyin.com/{unique_id}')if room_data['status'] == 2:if 'stream_url' not in room_data:raise RuntimeError("The live streaming type or gameplay is not supported on the computer side yet, please use the ""app to share the link for recording.")live_core_sdk_data = room_data['stream_url']['live_core_sdk_data']pull_datas = room_data['stream_url']['pull_datas']if live_core_sdk_data:if pull_datas:key = list(pull_datas.keys())[0]json_str = pull_datas[key]['stream_data']else:json_str = live_core_sdk_data['pull_data']['stream_data']json_data = json.loads(json_str)if 'origin' in json_data['data']:origin_url_list = json_data['data']['origin']['main']origin_m3u8 = {'ORIGIN': origin_url_list["hls"]}origin_flv = {'ORIGIN': origin_url_list["flv"]}hls_pull_url_map = room_data['stream_url']['hls_pull_url_map']flv_pull_url = room_data['stream_url']['flv_pull_url']room_data['stream_url']['hls_pull_url_map'] = {**origin_m3u8, **hls_pull_url_map}room_data['stream_url']['flv_pull_url'] = {**origin_flv, **flv_pull_url}except Exception as e:print(f"Error message: {e} Error line: {e.__traceback__.tb_lineno}")room_data = {'anchor_name': ""}return room_data

2 封装格式选择

  • 实时流:FLV/TS分段传输
    1、TS文件格式主要优势是容错性强,在部分数据帧丢失的情况下,后续数据仍能正常使用,支持多种编码格式;但是随之带来的劣势就是文件较大,同样时长的文件,TS比MP4要大10%左右。
    2、FLV属于传统的flash 视频编码格式,与MP4接近,但是比TS文件要小。
  • 存储文件:MP4/MKV容器特性对比
    1、在存储上来说,MP4兼容性与编码支持性最好,但是对于实时流录制支持不太好,原因是MP4格式元数据放在文件开头,如果文件中间损毁或者没有正常结束,会导致整个文件打不开。
    2、MKV属于开源存储容器格式,几乎支持所有编码格式,而且局部掉帧不会影响整个文件打不开,也是比较好的直播录屏保存格式,但是目前很多系统对这个格式的支持度一般。

🔍 对比总结与场景推荐

格式容错性文件体积兼容性实时性推荐场景
TS⭐⭐⭐⭐⭐较大⭐⭐⭐⭐⭐⭐⭐直播录制、广播电视(需高容错)
FLV⭐⭐⭐较小⭐⭐⭐⭐⭐⭐⭐旧直播系统、网络传输(快速起播)
MP4⭐⭐中等⭐⭐⭐⭐⭐⭐⭐⭐(需优化)点播存储、多平台分发(兼容优先)
MKV⭐⭐⭐⭐中等⭐⭐⭐⭐高清视频存档、多轨道编辑(后期制作)

建议优先选择TS与flv格式来保存直播文件。

三、关键技术实现方案
输入源
采集引擎
编码器
封装模块
网络推流
本地存储

四、性能优化核心挑战
挑战解决方案技术指标提升
CPU占用过高硬件编码器调用(NVENC/QSV)资源降低60%~80%
直播卡顿自适应码率(ABR)算法卡顿率<0.5%
音画不同步PTS时间戳校准机制误差<40ms
大文件存储分片录制+即时转封装中断恢复<1s

五、典型架构案例解析
  1. 中小型方案
    # 简易录屏流程伪代码
    def record_live():video = capture_screen()      # 视频采集audio = capture_audio()       # 音频采集encoded = h264_encode(video) # 硬件编码save_to_mp4(encoded, audio)  # 封装存储
    

参考文献:

  • DouyinLiveRecorder
  • 快抖直播录制助手更新了,增加TS和FLV录制格式
  • 直播源链接一键获取
http://www.lryc.cn/news/586554.html

相关文章:

  • 系统性学习C语言-第十五讲-深入理解指针(5)
  • 【华为OD】MVP争夺战2(C++、Java、Python)
  • JVM--虚拟线程
  • 数据结构之并查集和LRUCache
  • STP生成树划分实验
  • 飞算JavaAI:重新定义Java开发效率的智能引擎
  • 【机器学习实战笔记 16】集成学习:LightGBM算法
  • Waiting for server response 和 Content Download
  • 【离线数仓项目】——电商域DWS层开发实战
  • BugBug.io 使用全流程(202507)
  • 计算机毕业设计Java停车场管理系统 基于Java的智能停车场管理系统开发 Java语言实现的停车场综合管理平台
  • STM32中的RTC(实时时钟)详解
  • 《Spring 中上下文传递的那些事儿》Part 8:构建统一上下文框架设计与实现(实战篇)
  • 利用docker部署前后端分离项目
  • 【攻防实战】记一次DC2攻防实战
  • 电网失真下单相锁相环存在的问题
  • CANoe实操学习车载测试课程、独立完成CAN信号测试
  • Spring Boot整合MyBatis+MySQL+Redis单表CRUD教程
  • 前端面试宝典---项目难点2-智能问答对话框采用虚拟列表动态渲染可视区域元素(10万+条数据)
  • 快速排序递归和非递归方法的简单介绍
  • Armstrong 公理系统深度解析
  • 人机协作系列(三)个体创业者的“新物种革命”
  • Agent任务规划
  • 分布式系统高可用性设计 - 缓存策略与数据同步机制
  • PostgreSQL安装及简单应用
  • 后端定时过期方案选型
  • python-for循环
  • linux 系统找出磁盘IO占用元凶 —— 筑梦之路
  • 工业软件出海的ERP-PLM-MES一体化解决方案
  • PostgreSQL HOT (Heap Only Tuple) 更新机制详解