当前位置: 首页 > 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.xdnf.cn/news/1112041.html

相关文章:

  • LLM 不知道答案,但是知道去调用工具获取答案?
  • 基于STM32F412+RT-Thread的智能汽车CAN通信仪表盘
  • ADSP-1802这颗ADI的最新DSP应该怎么做开发(一)
  • JavaScript 常见10种设计模式
  • TCP详解——各标志位
  • linux 系统找出磁盘IO占用元凶 —— 筑梦之路
  • Java从入门到精通!第四天(面向对象(一))
  • HTTP和HTTPS部分知识点
  • python库之jieba 库
  • 模拟注意力:少量参数放大 Attention 表征能力
  • C#与FX5U进行Socket通信
  • 【设计模式】桥接模式(柄体模式,接口模式)
  • OneCode 3.0架构深度剖析:工程化模块管理与自治UI系统的设计与实现
  • 企业商业秘密保卫战:经营信息类案件维权全攻略
  • 分布式系统高可用性设计 - 缓存策略与数据同步机制
  • wedo稻草人-----第32节(免费分享图纸)
  • 实验一 接苹果
  • LeetCode经典题解:3、无重复字符的最长子串
  • ADI的EV-21569-SOM核心板和主板转接卡的链接说明
  • Kubernetes持久卷实战
  • 13. G1垃圾回收器
  • os.loadavg()详解
  • Python 训练营打卡 Day 59-经典时序预测模型3
  • Java 大视界 -- Java 大数据机器学习模型在电商用户复购行为预测与客户关系维护中的应用(343)
  • IDEA中一个服务创建多个实例
  • 【C/C++】迈出编译第一步——预处理
  • [案例八] NX二次开发长圆孔的实现(支持实体)
  • TensorFlow2 study notes[2]
  • 【Linux网络】IP 协议详解:结构、地址与交付机制全面解析
  • 算法第三十一天:贪心算法part05(第八章)