• python利用ffmpeg实现视频流的下载,并分段保存


    一段示例代码。self._running是线程运行参数,=TRUE;
    get_random_ua()是生成一个user_agent,也可以写成固定字符串,例如“Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 SE 2.X MetaSr 1.0”;
    Splittimes 是分段的时长,单位"秒";
    filename 不用解释,包含全路径;
    注释掉的Splitsizes 是分段的大小,单位"字节";

    1. while self._running:
    2. now = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
    3. print(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") ,f'第{i}次录制')
    4. print(f'录制url:{url}')
    5. houzhui=re.findall("\.\w+",url)[-1]
    6. print(f'文件后缀名:{houzhui}')
    7. filenameshort=now +houzhui
    8. filename=filepath+'/'+filenameshort #os.path.join(filepath, filenameshort) #
    9. print(url)
    10. print("\r"," 分段录制视频中: ",filename, " 每录满: %d 分钟 存一个视频"%Splittime)
    11. #logger.info(f'{filename}录制')
    12. try:
    13. logger.info(f'{filename}开始录制')
    14. p = subprocess.check_output([
    15. ffmpeg_path, "-y",
    16. "-v","verbose",
    17. "-rw_timeout","10000000", # 10s
    18. "-loglevel","error",
    19. "-hide_banner",
    20. "-user_agent",get_random_ua(),
    21. "-protocol_whitelist","rtmp,crypto,file,http,https,tcp,tls,udp,rtp",
    22. "-thread_queue_size","1024",
    23. "-analyzeduration","2147483647",
    24. "-probesize","2147483647",
    25. "-fflags","+discardcorrupt",
    26. "-i",url,
    27. "-bufsize","5000k",
    28. "-map","0",
    29. "-sn","-dn",
    30. "-reconnect_delay_max","30","-reconnect_streamed","-reconnect_at_eof",
    31. "-c:v","copy",
    32. "-c:a","copy",
    33. "-max_muxing_queue_size","64",
    34. "-correct_ts_overflow","1",
    35. "-f","mpegts",
    36. #"-fs",str(Splitsizes),
    37. "-t",str(Splittimes),
    38. "{path}".format(path=filename),
    39. ], stderr = subprocess.STDOUT)
    40. except subprocess.TimeoutExpired as time_e:
    41. print(time_e)
    42. logger.info(time_e)
    43. time.sleep(5)
    44. continue
    45. except subprocess.CalledProcessError as call_e:
    46. print(call_e.output.decode(encoding="utf-8"))
    47. if 'NOT' in call_e.output.decode(encoding="utf-8").upper() or 'ERROR' in call_e.output.decode(encoding="utf-8").upper():
    48. logger.info('直播结束')
    49. logger.info( call_e.output.decode(encoding="utf-8"))
    50. #sched2.shutdown(wait=False)
    51. break
    52. time.sleep(5)
    53. continue
    54. except Exception as e:
    55. print(e)
    56. logger.info(e)
    57. if "error" in str(e): #Unknown error
    58. logger.info('录制非正常结束2')
    59. #sched2.shutdown(wait=False)
    60. time.sleep(5)
    61. continue

  • 相关阅读:
    数字人IP为何成家电品牌年轻化营销黑马?
    多种隐藏滚动条但是依然可以滚动实现方式
    JVM-环境准备&性能指标&基础知识
    【HTML】HTML网页设计---海贼王动漫前端设计
    Dockershim 与 Containerd:两种容器运行时的故事
    JavaEE——spring MVC请求处理
    查询性能提升3倍!Apache Hudi 查询优化了解下?
    MyEclipse项目导入与导出
    工具类实现导出复杂excel、word
    Elasticsearch TLS 激活:X-Pack 安全性
  • 原文地址:https://blog.csdn.net/cc605523/article/details/140376578