成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > python實(shí)現(xiàn)的B站直播錄制工具

python實(shí)現(xiàn)的B站直播錄制工具

熱門標(biāo)簽:溫州旅游地圖標(biāo)注 幫人做地圖標(biāo)注收費(fèi)算詐騙嗎 外呼不封號系統(tǒng) 遼寧400電話辦理多少錢 電信營業(yè)廳400電話申請 悟空智電銷機(jī)器人6 江蘇房產(chǎn)電銷機(jī)器人廠家 蘇州電銷機(jī)器人十大排行榜 荊州云電銷機(jī)器人供應(yīng)商

項(xiàng)目地址:

https://github.com/Redlnn/blive_record

前言

  • 作者: Red_lnn
  • 不允許將本項(xiàng)目運(yùn)用于非法以及違反B站用戶協(xié)議的用途
  • 僅支持單個(gè)主播,多個(gè)主播請復(fù)制多份并分開單獨(dú)啟動(dòng)
  • 運(yùn)行時(shí)如要停止錄制并退出,請按鍵盤 Ctrl+C
  • 如要修改錄制設(shè)置,請以純文本方式打開.py文件
  • 利用 FFmpeg 直接抓取主播推送的流,無需打開瀏覽器
  • 有新功能需求請直接提 Pull requests
  • 建議錄制為 flv 格式(默認(rèn)),以防止意外中斷導(dǎo)致錄制文件損壞,若要進(jìn)行剪輯可使用 FFmpeg 轉(zhuǎn)換為 mp4 文件后再倒入到剪輯軟件(使用 FFmpeg 轉(zhuǎn)換 flv 為 mp4 : ffmpeg -i {input}.flv -c:v copy -c:a copy {output}.mp4)

使用方式

1.安裝 Python(>=3.7) 并設(shè)置環(huán)境變量

2.打開終端或命令行進(jìn)入本腳本所在目錄

3.通過 pip 安裝必須的第三方庫

Windows:

pip install -r requirements.txt

Linux:

python3 -m pip install -r requirements.txt

4.下載 ffmpeg 并正確設(shè)置環(huán)境變量(下載地址)
5.Windows 直接雙擊運(yùn)行start.bat
6.Linux 先運(yùn)行 chmod +x start.sh 再運(yùn)行 ./start.sh

主要代碼

blive_record.py

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

"""
*--------------------------------------*
 B站直播錄播姬 By: Red_lnn
 僅支持單個(gè)主播,多個(gè)主播請復(fù)制多份并分開單獨(dú)啟動(dòng)
 運(yùn)行時(shí)如要停止錄制并退出,請按鍵盤 Ctrl+C
 如要修改錄制設(shè)置,請以純文本方式打開.py文件
 利用ffmpeg直接抓取主播推送的流,不需要打開瀏覽器
*--------------------------------------*
"""

# import ffmpy3  # noqa
import logging
import os
import signal
import sys
import threading
import time
import traceback
from json import loads
from logging import handlers
from subprocess import PIPE, Popen, STDOUT

import requests
from regex import match

# 導(dǎo)入配置
from config import *   # noqa

record_status = False  # 錄制狀態(tài),True為錄制中
kill_times = 0  # 嘗試強(qiáng)制結(jié)束FFmpeg的次數(shù)

logging.addLevelName(15, 'FFmpeg')  # 自定義FFmpeg的日志級別
logger = logging.getLogger('Record')
logger.setLevel(logging.DEBUG)

fms = '[%(asctime)s %(levelname)s] %(message)s'
# datefmt = "%Y-%m-%d %H:%M:%S"
datefmt = "%H:%M:%S"

default_handler = logging.StreamHandler(sys.stdout)
if debug:
    default_handler.setLevel(logging.DEBUG)
elif verbose:
    default_handler.setLevel(15)
else:
    default_handler.setLevel(logging.INFO)
default_handler.setFormatter(logging.Formatter(fms, datefmt=datefmt))
logger.addHandler(default_handler)

if save_log:
    # file_handler = logging.FileHandler("debug.log", mode='w+', encoding='utf-8')
    if not os.path.exists(os.path.join('logs')):
        os.mkdir(os.path.join('logs'))
    file_handler = handlers.TimedRotatingFileHandler(os.path.join('logs', 'debug.log'), 'midnight', encoding='utf-8')
    if debug:
        default_handler.setLevel(logging.DEBUG)
    else:
        default_handler.setLevel(15)
    file_handler.setFormatter(logging.Formatter(fms, datefmt=datefmt))
    logger.addHandler(file_handler)


def get_timestamp() -> int:
    """
    獲取當(dāng)前時(shí)間戳
    """
    return int(time.time())


def get_time() -> str:
    """
    獲取格式化后的時(shí)間
    """
    time_now = get_timestamp()
    time_local = time.localtime(time_now)
    dt = time.strftime("%Y%m%d_%H%M%S", time_local)
    return dt


def record():
    """
    錄制過程中要執(zhí)行的檢測與判斷
    """
    global p, record_status, last_record_time, kill_times  # noqa
    while True:
        line = p.stdout.readline().decode()
        p.stdout.flush()
        logger.log(15, line.rstrip())
        if match('video:[0-9kmgB]* audio:[0-9kmgB]* subtitle:[0-9kmgB]*', line) or 'Exiting normally' in line:
            record_status = False  # 如果FFmpeg正常結(jié)束錄制則退出本循環(huán)
            break
        elif match('frame=[0-9]', line) or 'Opening' in line:
            last_record_time = get_timestamp()  # 獲取最后錄制的時(shí)間
        elif 'Failed to read handshake response' in line:
            time.sleep(5)  # FFmpeg讀取m3u8流失敗,等個(gè)5s康康會(huì)不會(huì)恢復(fù)
            continue
        time_diff = get_timestamp() - last_record_time  # 計(jì)算上次錄制到目前的時(shí)間差
        if time_diff >= 65:
            logger.error('最后一次錄制到目前已超65s,將嘗試發(fā)送終止信號')
            logger.debug(f'間隔時(shí)間:{time_diff}s')
            kill_times += 1
            p.send_signal(signal.SIGTERM)  # 若最后一次錄制到目前已超過65s,則認(rèn)為FFmpeg卡死,嘗試發(fā)送終止信號
            time.sleep(0.5)
            if kill_times >= 3:
                logger.critical('由于無法結(jié)束FFmpeg進(jìn)程,將嘗試自我了結(jié)')
                sys.exit(1)
        if 'Immediate exit requested' in line:
            logger.info('FFmpeg已被強(qiáng)制結(jié)束')
            break
        if p.poll() is not None:  # 如果FFmpeg已退出但沒有被上一個(gè)判斷和本循環(huán)第一個(gè)判斷捕捉到,則當(dāng)作異常退出
            logger.error('ffmpeg未正常退出,請檢查日志文件!')
            record_status = False
            break


def main():
    global p, room_id, record_status, last_record_time, kill_times  # noqa
    while True:
        record_status = False
        while True:
            logger.info('------------------------------')
            logger.info(f'正在檢測直播間:{room_id}')
            try:
                room_info = requests.get(f'https://api.live.bilibili.com/room/v1/Room/get_info?room_id={room_id}',
                                         timeout=5)
            except (requests.exceptions.ReadTimeout, requests.exceptions.Timeout, requests.exceptions.ConnectTimeout):
                logger.error(f'無法連接至B站API,等待{check_time}s后重新開始檢測')
                time.sleep(check_time)
                continue
            live_status = loads(room_info.text)['data']['live_status']
            if live_status == 1:
                break
            elif live_status == 0:
                logger.info(f'沒有開播,等待{check_time}s重新開始檢測')
            time.sleep(check_time)
        if not os.path.exists(os.path.join('download')):
            try:
                os.mkdir(os.path.join('download'))
            except:  # noqa
                logger.error(f'無法創(chuàng)建下載文件夾 ↓\n{traceback.format_exc()}')
                sys.exit(1)
        if os.path.isfile(os.path.join('download')):
            logger.error('存在與下載文件夾同名的文件')
            sys.exit(1)
        logger.info('正在直播,準(zhǔn)備開始錄制')
        m3u8_list = requests.get(
            f'https://api.live.bilibili.com/xlive/web-room/v1/playUrl/playUrl?cid={room_id}platform=h5qn=10000')
        m3u8_address = loads(m3u8_list.text)['data']['durl'][0]['url']
        # 下面命令中的timeout單位為微秒,10000000us為10s(https://www.cnblogs.com/zhifa/p/12345376.html)
        command = ['ffmpeg', '-rw_timeout', '10000000', '-timeout', '10000000', '-listen_timeout', '10000000',
                   '-headers',
                   '"Accept: */*? Accept-Encoding: gzip, deflate, br? Accept-Language: zh,zh-TW;q=0.9,en-US;q=0.8,en;'
                   f'q=0.7,zh-CN;q=0.6,ru;q=0.5? Origin: https://live.bilibili.com/{room_id}? '
                   'User-Agent: Mozilla/5.0 (Windows NT 10.0;Win64; x64) '
                   'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36?"', '-i',
                   m3u8_address, '-c:v', 'copy', '-c:a', 'copy', '-bsf:a', 'aac_adtstoasc',
                   '-f', 'segment', '-segment_time', str(segment_time), '-segment_start_number', '1',
                   os.path.join('download', f'[{room_id}]_{get_time()}_part%03d.{file_extensions}'), '-y']
        if debug:
            logger.debug('FFmpeg命令如下 ↓')
            command_str = ''
            for _ in command:
                command_str += _
            logger.debug(command_str)
        p = Popen(command, stdin=PIPE, stdout=PIPE, stderr=STDOUT, shell=False)
        record_status = True
        start_time = last_record_time = get_timestamp()
        try:
            t = threading.Thread(target=record)
            t.start()
            while True:
                if not record_status:
                    break
                if verbose or debug:
                    time.sleep(20)
                    logger.info(f'--==>>> 已錄制 {round((get_timestamp() - start_time) / 60, 2)} 分鐘 ==--')
                else:
                    time.sleep(60)
                    logger.info(f'--==>>> 已錄制 {int((get_timestamp() - start_time) / 60)} 分鐘 ==--')
                if not record_status:
                    break
        except KeyboardInterrupt:
            # p.send_signal(signal.CTRL_C_EVENT)
            logger.info('停止錄制,等待ffmpeg退出后本程序會(huì)自動(dòng)退出')
            logger.info('若長時(shí)間卡住,請?jiān)俅伟聪耤trl+c (可能會(huì)損壞視頻文件)')
            logger.info('Bye!')
            sys.exit(0)
        kill_times = 0
        logger.info('FFmpeg已退出,重新開始檢測直播間')
        # time.sleep(check_time)


if __name__ == '__main__':
    logger.info('B站直播錄播姬 By: Red_lnn')
    logger.info('如要停止錄制并退出,請按鍵盤 Ctrl+C')
    logger.info('如要修改錄制設(shè)置,請以純文本方式打開.py文件')
    logger.info('準(zhǔn)備開始錄制...')
    time.sleep(0.3)
    try:
        main()
    except KeyboardInterrupt:
        logger.info('Bye!')
        sys.exit(0)

config.py(配置文件)

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

"""
*------------以下為可配置項(xiàng)-------------*
"""
# room_id = 1151716  # 萵苣某人
# room_id = 1857249  # Red_lnn
room_id = 1151716  # 要錄制的B站直播間的直播間ID
segment_time = 3600  # 錄播分段時(shí)長(單位:秒)
check_time = 60  # 開播檢測間隔(單位:秒)
file_extensions = 'flv'  # 錄制文件后綴名(文件格式)
verbose = True  # 是否打印ffmpeg輸出信息到控制臺
debug = False  # 是否顯示并保存調(diào)試信息(優(yōu)先級高于 verbose)
save_log = True  # 是否保存日志信息為文件,同一天多次啟動(dòng)本腳本會(huì)共用同一個(gè)日志文件,每天凌晨分割一次日志文件
"""
*------------以上為可配置項(xiàng)-------------*
"""

以上就是python實(shí)現(xiàn)的B站直播錄播工具的詳細(xì)內(nèi)容,更多關(guān)于python B站直播錄播的資料請關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • python實(shí)現(xiàn)錄制全屏和選擇區(qū)域錄屏功能
  • python實(shí)現(xiàn)錄屏功能(親測好用)
  • python 偷懶技巧——使用 keyboard 錄制鍵盤事件
  • Python實(shí)現(xiàn)播放和錄制聲音的功能
  • Python實(shí)現(xiàn)屏幕錄制功能的代碼
  • 使用Python來做一個(gè)屏幕錄制工具的操作代碼
  • Python+opencv+pyaudio實(shí)現(xiàn)帶聲音屏幕錄制
  • Python+OpenCV+pyQt5錄制雙目攝像頭視頻的實(shí)例
  • python基于tkinter實(shí)現(xiàn)gif錄屏功能

標(biāo)簽:宿遷 黃山 景德鎮(zhèn) 臺灣 濟(jì)南 三沙 喀什 欽州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《python實(shí)現(xiàn)的B站直播錄制工具》,本文關(guān)鍵詞  python,實(shí)現(xiàn),的,站,直播,錄制,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《python實(shí)現(xiàn)的B站直播錄制工具》相關(guān)的同類信息!
  • 本頁收集關(guān)于python實(shí)現(xiàn)的B站直播錄制工具的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    色香蕉在线观看| 日韩脚交footjobhdboots| 中文字幕www| 日韩美女写真福利在线观看| 久久9热精品视频| 日本中文字幕电影在线观看| 国产精品久久精品日日| 成人激情免费电影网址| 91国内在线| 欧美亚洲不卡| 激情欧美丁香| 亚洲天堂日韩av| 德国极品另类| 91香蕉国产在线观看| 国自产拍偷拍福利精品免费一| 中文字幕三级电影| 精品欧美一区免费观看α√| 欧美亚洲国产一区在线观看网站| 国产欧美日韩精品在线观看| 久久综合精品国产一区二区三区| 亚洲欧美另类视频| 亚洲视频观看| 国产极品美女在线| 欧洲有码在线视频| 天堂成人免费av电影一区| 亚洲女同一区| 你微笑时很美电视剧整集高清不卡| 欧美激情第三页| 日韩影院在线观看| 国产在线播放你懂的| 多人啪嗒啪嗒在线观看免费| 天堂中文av在线资源库| 国产精品日韩高清| 中文字幕第二区| 欧美国产精品人人做人人爱| 亚洲r级在线观看| 农村妇女精品一区二区| 欧美黑白配在线| 68精品国产免费久久久久久婷婷| 欧美日本一区二区高清播放视频| 一级黄色片在线播放| 激情综合网五月婷婷| 性欧美18一19性猛交| 国产激情在线看| 欧美亚洲日本一区| 欧美重口另类videos人妖| 少妇久久久久久被弄高潮| 国产精品天堂蜜av在线播放| 试看120秒一区二区三区| 国风产精品一区二区| 九色一区二区| 日韩一级精品| av男人天堂一区| 免费污网站在线观看| 九九视频精品在线观看| 男女爽爽爽视频| 在线成人一区二区| 日韩欧美国产电影| 国产精品无码在线| 亚洲一区亚洲| **孕交吃奶水一级毛片| 精品乱码亚洲一区二区不卡| 丰满放荡岳乱妇91ww| 欧美少妇精品| 欧美精品在线看| 青青青视频在线免费观看| 青青草成人免费在线视频| 黄页免费欧美| 爱情岛论坛亚洲自拍| 精品亚洲乱码一区二区| 久久综合九色综合久久久精品综合| 4p变态网欧美系列| 亚洲男人天天操| 天堂网免费视频| 色呦色呦色精品| 欧美人伦禁忌dvd放荡欲情| 亚洲第一页中文字幕| 免费人成黄页在线观看忧物| 久久午夜宅男免费网站| 欧美v亚洲v综合ⅴ国产v| 男人的天堂av高清在线| 一个色综合av| 国产很黄免费观看久久| 欧美午夜性囗交xxxx| 日韩小视频在线观看专区| 免费看男女www网站入口在线| 精品视频在线观看| 精品亚洲a∨一区二区三区18| 欧美亚洲爱爱另类综合| 国产欧美精品在线| 日韩在线影视| 全部免费毛片在线播放一个| 欧美激情免费观看| 久久久久久久免费视频了| 91亚洲精品| 日韩伦理在线| 精品欧美午夜寂寞影院| 性欧美办公室18xxxxhd| 亚洲乱码国产乱码精品精可以看| 五月天丁香社区| 国产麻豆9l精品三级站| www国产成人| 九九热视频精品在线观看| 综合图区亚洲白拍在线| 日本一区二区电影| 中文字幕免费高清电视剧网站在线观看| 无码人妻精品一区二区三区66| 久久久精品午夜少妇| www高清在线视频日韩欧美| 日韩无码精品一区二区三区| 欧美一级电影网站| av在线免费播放网址| 日韩视频亚洲视频| 久久这里只有| 欧美一性一交| 狠狠综合久久av一区二区| 一本色道无码道dvd在线观看| 特级特黄刘亦菲aaa级| 天堂av电影在线观看| 欧美另类高清videos| 人与人69性欧美三人交| 亚洲一区二区三区网站| 亚洲在线视频观看| 日精品一区二区三区| 99热这里只有精品4| 亚洲日本视频在线| 免费h片在线观看| 成人在线一区| 无码国产精品一区二区免费式直播| 丝袜亚洲另类欧美| xxx国产精品| 永久免费看片在线播放| 国产浴室偷窥在线播放| 国产夫绿帽单男3p精品视频| 久热中文字幕在线观看| 在线免费视频一区| 久久av红桃一区二区禁漫| 日本视频一区二区不卡| 久久精品夜夜夜夜夜久久| 亚洲福利视频免费观看| 久久综合给合久久狠狠狠97色69| 性欧美xxxx交| 欧美一区二区在线观看视频| 欧美 亚洲 视频| www.日韩视频| 欧美tickling挠脚心丨vk| 欧美日韩大片一区二区三区| 激情av在线| 国产精品久久一| 国产一区二区三区电影在线观看| 四虎影院影音| 亚洲成人xxx| 狠狠色狠狠色综合日日小说| 欧美日韩电影一区二区三区| 久久影院资源站| 蜜桃精品在线| 疯狂撞击丝袜人妻| 9999精品| 中文在线字幕免费观看| 欧美色图亚洲视频| 日本a级片在线观看| 黄污网站在线观看| 26uuu成人| 欧美日韩日本网| 99电影在线观看| 最新福利小视频在线播放| 国产无遮挡免费视频| 欧美男人亚洲天堂| 国产精品一区二区欧美黑人喷潮水| 91天堂在线观看| 国产日产亚洲精品| 国产玉足脚交久久欧美| 伊人久久av导航| 天天色天天操综合| 国产超碰人人模人人爽人人添| 日韩 欧美 精品| chinese麻豆新拍video| 日韩精品电影网| 色婷婷av一区二区三区之e本道| 亚洲精品第三页| 欧美一级精品| 一个人免费观看视频www在线播放| 欧美激情一区二区视频| 男人和女人做事情在线视频网站免费观看| 香蕉成人伊视频在线观看| 国产精品黄色影片导航在线观看| 拍拍拍无挡免费播放视频在线观看| 国产日韩在线观看一区| 久久不射电影网| 精品中文视频| 国产黄色片免费看| 美女无遮挡网站| 久久99热99| 国产精选一区二区三区| 在线能看的黄色| 四虎地址8848| 在线免费观看毛片| 日本高清中文字幕在线| 日本激情一区二区| 欧美高清在线精品一区| 国产 中文 字幕 日韩 在线| 一炮成瘾1v1高h| 欧美精品xxx| 亚洲三级免费| 永久免费毛片在线播放不卡| 精品欧美一区二区精品久久| 久久综合久久综合这里只有精品| 中文字幕天天干| 欧美在线你懂得| 日韩欧美中文视频| 欧美性猛交99久久久久99| 好吊色视频在线观看| 一级黄色片在线免费观看| 你懂的在线视频| 久久久国产精品网站| 亚洲色图 在线视频| 国产黄色精品视频| 久久人人97超碰人人澡爱香蕉| 欧美一级片免费看| 国产在线视频资源| 99久久亚洲国产日韩美女| 国产又大又黄又爽| 久久久久久久99| 免费观看欧美成人禁片| 黄片毛片在线看| 欧美成人一区二区在线| 欧美精品一区二区性色a+v| 亚洲最新av在线| 亚洲v日韩v综合v精品v| 成年人免费高清视频| 女人被男人躁得好爽免费视频| 精品国产一区二区三区久久久樱花| 亚洲天堂a在线| 国产熟人av一二三区| 久久久人成影片一区二区三区| 成人黄色av网站| 精品国产乱码久久久久久夜甘婷婷| 97人妻人人澡人人爽人人精品| 亚洲深深色噜噜狠狠爱网站| 99精品视频中文字幕| 黄色网址在线视频| www.香蕉视频| 免费在线看电影| 日韩男女性生活视频| a级影片在线观看| 麻豆成人在线播放| 成人午夜电影免费在线观看| 不卡在线一区| 蜜桃视频网站www| 超碰在线caoporen| 欧美一区二区三区另类| 中文字幕av一区二区三区佐山爱| 久久成人av网站| 97超碰在线免费| 伊甸园亚洲一区| av毛片在线| 亚洲影院在线播放| 全球成人免费直播| 日日狠狠久久偷偷四色综合免费| 日本午夜精品理论片a级app发布| 最新中文字幕在线视频| 国产亚洲精品午夜高清影院| 亚洲高清视频一区| 日韩成人中文电影| 一本一道久久a久久精品逆3p| 免费看国产一级片| 亚洲精品国产无码| 国产中文在线播放| 国产永久免费高清在线观看视频| 日韩精品视频在线观看一区二区三区| 一本色道亚洲精品aⅴ| h在线观看网站| 雨宫琴音一区二区三区| 国产一区二区99| 欧美日韩精品一区二区三区四区| 91制片在线观看| 国产大学生粉嫩无套流白浆| 9191久久久久久久久久久| 成人欧美一区二区三区黑人免费| www.久久久| 最新国产の精品合集bt伙计| 久久综合加勒比| 国产精品日韩精品在线播放| 麻豆成人91精品二区三区| 欧美日韩一区二区三区在线电影| www亚洲国产| 97视频精品| 久久免费精品视频在这里| 香蕉影视欧美成人| 国产无遮挡又黄又爽又色视频| 精品国产乱码久久久久久郑州公司| 午夜精品久久久久久久99热黄桃| 欧美变态口味重另类| 91福利电影| 9i看片成人免费看片| 精品人伦一区二区三区蜜桃网站| 最新日韩中文字幕| 国产精品三级av在线播放| 国内精品久久久久国产盗摄免费观看完整版| 亚洲成人免费av| 欧美色欧美亚洲另类| 欧州一区二区| 精品久久久久久综合日本欧美| 黄色av网站在线免费观看| 亚洲三级在线| 亚洲小说区图片| 九九热视频免费观看| 丝袜美腿诱惑一区二区三区| 日韩区国产区| 久久人人爽人人爽人人片| 国产精品无码白浆高潮| 成人激情直播| 婷婷在线观看视频| 久久久久久久久久久9不雅视频| 午夜免费啪视频观看视频| 国内激情视频在线观看| 亚洲午夜久久久久久久久电影院| 视频国产一区| 国产69精品久久久久久久| 91视频综合网| 国产极品视频在线观看| 娇妻高潮浓精白浆xxⅹ| va天堂va亚洲va影视| 欧美日韩亚洲网| 日本高清视频网站www| 欧美午夜片在线看| 日本在线成人| 亚洲精品久久久久久久久久久久|