当前位置: 首页 > news >正文

视频处理基础之gradio框架实现

这些函数是用于处理视频文件的Python代码片段,它们依赖于`ffmpeg`和`ffprobe`工具,这些工具是`FFmpeg`项目的一部分,用于处理视频和音频数据。下面是每个函数的用途和用法的总结:

1. `ffmpeg_installed()` 函数:
   - 用途:检查系统是否安装了`ffmpeg`工具。
   - 用法:调用此函数无需参数,它会返回一个布尔值,指示`ffmpeg`是否可用。

2. `video_is_playable(video_filepath: str)` 函数:
   - 用途:确定视频文件是否可以在浏览器中播放。
   - 用法:传入视频文件的路径作为字符串,函数会检查视频的容器格式和编解码器是否符合浏览器的播放标准(如`.mp4`容器使用`h264`编解码器,`.webm`容器使用`vp9`编解码器等)。如果视频符合标准,则返回`True`,否则返回`False`。

3. `convert_video_to_playable_mp4(video_path: str)` 函数:
   - 用途:将视频转换为浏览器可以播放的MP4格式。
   - 用法:传入视频文件的路径作为字符串,函数会尝试将视频转换为MP4格式。如果转换过程中出现错误,则返回原始视频路径。

4. `get_video_length(video_path: str | Path)` 函数:
   - 用途:获取视频文件的时长。
   - 用法:传入视频文件的路径,函数会使用`ffprobe`工具来获取视频的时长,并以秒为单位返回一个浮点数。

这些函数的实现依赖于外部命令行工具`ffmpeg`和`ffprobe`,因此在使用这些函数之前,需要确保这些工具已经正确安装在系统上。此外,代码中还包含了一些错误处理机制,以确保在处理视频文件时能够优雅地处理异常情况。例如,如果`ffmpeg`或`ffprobe`命令失败,或者视频文件的格式不符合预期,函数会返回原始视频路径或抛出异常。
IS_WASM = sys.platform == "emscripten"

def ffmpeg_installed() -> bool:
    if wasm_utils.IS_WASM:
        # TODO: Support ffmpeg in WASM
        return False

    return shutil.which("ffmpeg") is not None


def video_is_playable(video_filepath: str) -> bool:
    """Determines if a video is playable in the browser.

    A video is playable if it has a playable container and codec.
        .mp4 -> h264
        .webm -> vp9
        .ogg -> theora
    """
    from ffmpy import FFprobe, FFRuntimeError

    try:
        container = Path(video_filepath).suffix.lower()
        probe = FFprobe(
            global_options="-show_format -show_streams -select_streams v -print_format json",
            inputs={video_filepath: None},
        )
        output = probe.run(stderr=subprocess.PIPE, stdout=subprocess.PIPE)
        output = json.loads(output[0])
        video_codec = output["streams"][0]["codec_name"]
        return (container, video_codec) in [
            (".mp4", "h264"),
            (".ogg", "theora"),
            (".webm", "vp9"),
        ]
    # If anything goes wrong, assume the video can be played to not convert downstream
    except (FFRuntimeError, IndexError, KeyError):
        return True


def convert_video_to_playable_mp4(video_path: str) -> str:
    """Convert the video to mp4. If something goes wrong return the original video."""
    from ffmpy import FFmpeg, FFRuntimeError

    try:
        with tempfile.NamedTemporaryFile(delete=False) as tmp_file:
            output_path = Path(video_path).with_suffix(".mp4")
            shutil.copy2(video_path, tmp_file.name)
            # ffmpeg will automatically use h264 codec (playable in browser) when converting to mp4
            ff = FFmpeg(
                inputs={str(tmp_file.name): None},
                outputs={str(output_path): None},
                global_options="-y -loglevel quiet",
            )
            ff.run()
    except FFRuntimeError as e:
        print(f"Error converting video to browser-playable format {str(e)}")
        output_path = video_path
    finally:
        # Remove temp file
        os.remove(tmp_file.name)  # type: ignore
    return str(output_path)


def get_video_length(video_path: str | Path):
    if wasm_utils.IS_WASM:
        raise wasm_utils.WasmUnsupportedError(
            "Video duration is not supported in the Wasm mode."
        )
    duration = subprocess.check_output(
        [
            "ffprobe",
            "-i",
            str(video_path),
            "-show_entries",
            "format=duration",
            "-v",
            "quiet",
            "-of",
            "csv={}".format("p=0"),
        ]
    )
    duration_str = duration.decode("utf-8").strip()
    duration_float = float(duration_str)

    return duration_float

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Transformer从零详细解读
  • 5G前传-介绍
  • IBM Storwize V7000存储控制器故障节点报错574
  • Redis典型应用 - 分布式锁
  • SVN下载安装使用方法
  • 【大数据】深入浅出Hadoop,干货满满
  • 深入解析 Dubbo 的 attachments 机制及其应用场景
  • 【Kubernetes知识点问答题】健康检查
  • 代码随想录打卡Day25
  • 远心镜头选型公式
  • windows C++-并行编程-将使用缩减变量的 OpenMP 循环转换为使用并发运行时
  • 71-java 导致线程上下文切换的原因
  • TensorRT-LLM高级用法
  • 2024 年高教社杯全国大学生数学建模竞赛 C 题 农作物的种植策略(详细思路+matlab代码+python代码+论文范例)
  • android系统源码12 修改默认桌面壁纸--SRO方式
  • bearychat的java client
  • CentOS7简单部署NFS
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • Javascript 原型链
  • Javascript基础之Array数组API
  • Java深入 - 深入理解Java集合
  • js操作时间(持续更新)
  • Js基础知识(一) - 变量
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • Quartz初级教程
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • Redis学习笔记 - pipline(流水线、管道)
  • spring cloud gateway 源码解析(4)跨域问题处理
  • 程序员最讨厌的9句话,你可有补充?
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 分享几个不错的工具
  • 关于Flux,Vuex,Redux的思考
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 人脸识别最新开发经验demo
  • 微信支付JSAPI,实测!终极方案
  • 我有几个粽子,和一个故事
  • 异常机制详解
  • 源码安装memcached和php memcache扩展
  • 正则表达式小结
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • ###C语言程序设计-----C语言学习(6)#
  • #if等命令的学习
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (HAL库版)freeRTOS移植STMF103
  • (MATLAB)第五章-矩阵运算
  • (vue)el-tabs选中最后一项后更新数据后无法展开
  • (不用互三)AI绘画:科技赋能艺术的崭新时代
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (理论篇)httpmoudle和httphandler一览
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (七)glDrawArry绘制
  • (生成器)yield与(迭代器)generator
  • (四)模仿学习-完成后台管理页面查询