直播录屏技术揭秘:以抖音直播录屏为例
一、引言:直播录屏的价值与挑战
想必你看过了很多直播录屏软件的介绍,他们要不全是广告推广,要不就是好几年前的软件了,有没有人维护还两说,他们不会告诉你为什么你用的时候要么断线,要么花屏,要么录制不完全,今天我就直播录制的核心技术来给大家讲解下,以后遇到问题也可以自己分析和解决了。
直播录屏大家用来最多的可能就是直播切片或者复盘学习了,一些场观10万+的直播,其话题度和热度能持续带来不少的热度,而且通过切片带货,不少小博主也能赚到不少生活费,因此,直播录制的热度长盛不衰。
然鹅,直播的实时性很高,对稳定性要求很严格,它不像下电影一下,还可以暂停等会再接着下,直播错过就没了,如果中间卡顿或者丢帧,有可能导致整个直播录制结果文件不可用,因此,直播录制的稳定性至关重要。
下面以大家常用的抖音为例,讲解如何录制抖音直播间。
二、直播录制的核心技术原理
- 直播数据流捕获层
- 视频流捕获:通常根据输入的抖音直播间地址,获取到房间号,然后通过官方接口获取直播流。
抖音的爬取比较简单,关键代码如下所示:
- 视频流捕获:通常根据输入的抖音直播间地址,获取到房间号,然后通过官方接口获取直播流。
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 |
五、典型架构案例解析
- 中小型方案
# 简易录屏流程伪代码 def record_live():video = capture_screen() # 视频采集audio = capture_audio() # 音频采集encoded = h264_encode(video) # 硬件编码save_to_mp4(encoded, audio) # 封装存储
参考文献:
- DouyinLiveRecorder
- 快抖直播录制助手更新了,增加TS和FLV录制格式
- 直播源链接一键获取