赞
踩
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 filter
、preset
和 crf
参数,跟 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())

https://github.com/jonghwanhyeon/python-ffmpeg
https://python-ffmpeg.readthedocs.io/
更多有用的 python
模块,请移步
https://xugaoxiang.com/category/python/modules/
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。