欢迎访问我的网站,希望内容对您有用,感兴趣的可以加入免费知识星球。

Python实用模块(四十一)python-ffmpeg

实用模块 迷途小书童 8个月前 (04-12) 717次浏览 0个评论

环境

  • python 3.8
  • python-ffmpeg 2.0.4

前言

python-ffmpeg 是一个基于 Python 的音视频处理库,它可以使用 FFmpeg 的各种功能来实现音视频的剪辑、转码、合成等操作。该库是由 FFmpeg 直接绑定的 Python 模块,它可以通过 Python 脚本控制 FFmpeg,从而实现音视频的处理,同时支持同步与异步 API,这也是它的特色之一。

安装

可以使用 pip 安装,具体操作如下

pip install python-ffmpeg

实操

同步与异步

同步是指在执行某个操作时,程序会一直等待该操作完成后才会继续执行下一步操作。它适用于需要等待操作完成后才能进行下一步的情况,但是如果操作时间较长,程序会一直卡在该操作上,影响程序的响应性能。

异步是指在执行某个操作时,程序会立即返回一个结果,不会等待该操作完成。它适用于需要同时执行多个操作或者需要长时间执行的操作,这样可以提高程序的响应性能。但是使用异步需要注意处理回调函数的逻辑,以确保程序的正确性。

同步转码

下面是一段示例代码,可以将输入视频 input.mp4 使用视频编码格式为 libx264,转码后得到 output.mp4,同时还使用了 video filterpresetcrf 参数,跟 ffmpeg 的命令行使用是一致的,option 对应的是 -y 参数,这是采用的同步的 API

from ffmpeg import FFmpeg, Progress

def main():
    ffmpeg = (
        FFmpeg()
        .option("y")
        .input("input.mp4")
        .output(
            "ouptut.mp4",
            {"codec:v": "libx264"},
            vf="scale=1280:-1",
            preset="veryslow",
            crf=24,
        )
    )

    ffmpeg.execute()

if __name__ == "__main__":
    main()

异步转码

下面的示例代码实现的功能和上面的一样,不同的是它采用了异步的 API

import asyncio

from ffmpeg import Progress
from ffmpeg.asyncio import FFmpeg

async def main():
    ffmpeg = (
        FFmpeg()
        .option("y")
        .input("input.mp4")
        .output(
            "ouptut.mp4",
            {"codec:v": "libx264"},
            vf="scale=1280:-1",
            preset="veryslow",
            crf=24,
        )
    )

    await ffmpeg.execute()

if __name__ == "__main__":
    asyncio.run(main())

同步录制

下面的示例代码展示了如何进行录制,视频源是一个流媒体,使用的协议是 rtsp,其它流媒体协议也是类似写法,API 采用同步方式

from ffmpeg import FFmpeg, Progress

def main():
    ffmpeg = (
        FFmpeg()
        .option("y")
        .input(
            "rtsp://username:password@127.0.0.1/cam",
            rtsp_transport="tcp",
            rtsp_flags="prefer_tcp",
        )
        .output("output.mp4", vcodec="copy")
    )

    @ffmpeg.on("progress")
    def time_to_terminate(progress: Progress):
        if progress.frame > 200:
            ffmpeg.terminate()

    ffmpeg.execute()

if __name__ == "__main__":
    main()

异步录制

下面的示例代码是采用异步方式进行的视频录制

import asyncio

from ffmpeg import Progress
from ffmpeg.asyncio import FFmpeg

async def main():
    ffmpeg = (
        FFmpeg()
        .option("y")
        .input(
            "rtsp://username:password@127.0.0.1/cam",
            rtsp_transport="tcp",
            rtsp_flags="prefer_tcp",
        )
        .output("output.mp4", vcodec="copy")
    )

    @ffmpeg.on("progress")
    def time_to_terminate(progress: Progress):
        if progress.frame > 200:
            ffmpeg.terminate()

    await ffmpeg.execute()

if __name__ == "__main__":
    asyncio.run(main())

参考资料

Python实用模块专题

更多有用的 python 模块,请移步

https://xugaoxiang.com/category/python/modules/

喜欢 (0)

您必须 登录 才能发表评论!

Ads Blocker Image Powered by Code Help Pro

Ads Blocker Detected!!!

请关闭 Adblock 等类似浏览器插件,然后刷新页面访问,感谢您的支持!

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.