当前位置:   article > 正文

一个 FFmpeg 封装库

python ffmpeg库

环境

前言

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

  1. from ffmpeg import FFmpeg, Progress
  2. def main():
  3.     ffmpeg = (
  4.         FFmpeg()
  5.         .option("y")
  6.         .input("input.mp4")
  7.         .output(
  8.             "ouptut.mp4",
  9.             {"codec:v""libx264"},
  10.             vf="scale=1280:-1",
  11.             preset="veryslow",
  12.             crf=24,
  13.         )
  14.     )
  15.     ffmpeg.execute()
  16. if __name__ == "__main__":
  17.     main()

异步转码

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

  1. import asyncio
  2. from ffmpeg import Progress
  3. from ffmpeg.asyncio import FFmpeg
  4. async def main():
  5.     ffmpeg = (
  6.         FFmpeg()
  7.         .option("y")
  8.         .input("input.mp4")
  9.         .output(
  10.             "ouptut.mp4",
  11.             {"codec:v""libx264"},
  12.             vf="scale=1280:-1",
  13.             preset="veryslow",
  14.             crf=24,
  15.         )
  16.     )
  17.     await ffmpeg.execute()
  18. if __name__ == "__main__":
  19.     asyncio.run(main())

同步录制

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

  1. from ffmpeg import FFmpeg, Progress
  2. def main():
  3.     ffmpeg = (
  4.         FFmpeg()
  5.         .option("y")
  6.         .input(
  7.             "rtsp://username:password@127.0.0.1/cam",
  8.             rtsp_transport="tcp",
  9.             rtsp_flags="prefer_tcp",
  10.         )
  11.         .output("output.mp4", vcodec="copy")
  12.     )
  13.     @ffmpeg.on("progress")
  14.     def time_to_terminate(progress: Progress):
  15.         if progress.frame > 200:
  16.             ffmpeg.terminate()
  17.     ffmpeg.execute()
  18. if __name__ == "__main__":
  19.     main()

异步录制

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

  1. import asyncio
  2. from ffmpeg import Progress
  3. from ffmpeg.asyncio import FFmpeg
  4. async def main():
  5.     ffmpeg = (
  6.         FFmpeg()
  7.         .option("y")
  8.         .input(
  9.             "rtsp://username:password@127.0.0.1/cam",
  10.             rtsp_transport="tcp",
  11.             rtsp_flags="prefer_tcp",
  12.         )
  13.         .output("output.mp4", vcodec="copy")
  14.     )
  15.     @ffmpeg.on("progress")
  16.     def time_to_terminate(progress: Progress):
  17.         if progress.frame > 200:
  18.             ffmpeg.terminate()
  19.     await ffmpeg.execute()
  20. if __name__ == "__main__":
  21.     asyncio.run(main())

参考资料

  • https://github.com/jonghwanhyeon/python-ffmpeg

  • https://python-ffmpeg.readthedocs.io/

Python实用模块专题

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/742640
推荐阅读
相关标签
  

闽ICP备14008679号