当前位置: 首页 > 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.dtcms.com/a/276801.html

相关文章:

  • 【嘉立创】四层板设计
  • 如何搭建一个高质量的开放接口平台
  • 数据结构与算法之美:线索二叉树
  • 【Scratch】从入门到放弃(四):指令大全-九大类之事件、控制、侦测
  • 解释全连接层的“参数数量”和“计算过程”,保证像看动画片一样直观~
  • c++反射实现
  • # 打开【设备和打印机】菜单时显示成新式【打印机和扫描仪】菜单,怎么才能显示传统带打印机图标菜单?
  • batchnorm类
  • 【DIY小记】逸剑风云决烟尘回响+武家旧事+碧海仙踪DLC攻略整合
  • 哈希扩展 --- 位图
  • 专业硬件检测工具 AIDA64 Extreme V7.70.7500 至尊版
  • Sentry 集成
  • 基于51单片机的超声波智能避障小车仿真
  • YOLOv11 vs 前代模型:全面性能对比与分析
  • 蒙特卡洛树搜索方法实践
  • 系统性学习C语言-第十五讲-深入理解指针(5)
  • matplotlib:多个图表的绘制
  • RocketMQ-
  • 69 局部变量的空间分配
  • 系统引导修复
  • 功耗校准数据PowerProfile测试方法建议
  • (一)一阶数字低通滤波器---原理及其推导
  • 程序改错---字符串
  • 十三、K8s自定义资源Operator
  • 客户资源被挖?营销方案泄露?企业经营信息保护避坑指南
  • Python Day11
  • Agent任务规划
  • 【PMP备考】敏捷思维:驾驭不确定性的项目管理之道
  • QT中设计qss字体样式但是没有用【已解决】
  • 文件系统(精讲)