来自实践中的教训,有时候纯ffmpeg命令并不好使,还得需要ffmpy包装器

网友投稿 1072 2022-05-30

您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦。

本文是ffmpeg使用的第二篇文章,主要是关于ffmpy的使用。

干货满满,建议,需要用到时常看看。 小伙伴们如有问题及需要,欢迎踊跃留言哦~ ~ ~。

前言

ffmpy库的引入

ffmpy官方文档的地址

ffmpy的介绍

FFmpeg类的构造方法

FFmpeg的run方法

ffmpy的使用

1. webm转mp4直接执行ffmpeg的写法是:

2. webm转mp4通过ffmpy执行的写法是:

3.多个视频合并

4. 视频剪切

4.音频同轨

总结

前言

如果对ffmpeg命令的使用还不熟练的小伙伴可以看下第一篇文章实战详细讲解ffmpeg命令的使用(来自一线的经验,视频合并&avi转MP4&补空白音频【下来一定用的到】)

为什么要介绍ffmpy呢?这是因为在项目开发中将ffmpeg的命令集成到flask框架时碰到部分命令在Linux下不能执行的情况。当时很是郁闷!!!单独执行ffmpeg命令没有问题。但是集成到项目中就是不行。那叫一个郁闷呀。ffmpy3是一个用于FFmpeg的Python包装器,最初是从ffmpy项目派生出来的。

ffmpy库的引入

要想使用ffmpy。首先需要引入ffmpy库,我这里使用的版本是0.2.2。引入的命令是:

pip install ffmpy==0.2.2 -i https://pypi.douban.com/simple

这里使用了豆瓣云,因为原生的进行下载依赖库的速度比较慢。

ffmpy官方文档的地址

https://ffmpy3.readthedocs.io/en/latest/ffmpy3.html

ffmpy的介绍

ffmpy中的FFmpeg类有两个核心的方法。一个是类的构造方法,一个是run方法。

FFmpeg类的构造方法

FFmpeg(executable='ffmpeg', global_options=None, inputs=None, outputs=None)

FFmpeg类的构造方法,说白了就是生成一个FFmpeg类的实例。其各个参数的含义是:

executable指的是查找ffmpeg的命令,默认情况下从环境变量PATH中取ffmpeg命令,如果没有配置环境变量的话,则覆盖execuable,传入ffmpeg程序的绝对路径。

global_options:指的是ffmpeg命令的全局命令参数,比如:-y,-v等等

inputs(dict): 传入的是一个字典,key为输入文件的地址,value为对输入文件的操作命令参数。默认情况下是带有 -i 命令参数的。

outputs (dict): 传入的是一个字典,key为输出文件的地址,value为对输出文件的操作命令参数。

FFmpeg的run方法

FFmpeg的run方法的作用是执行FFmpeg命令。该方法的定义是:run(input_data=None, stdout=None, stderr=None)。各个参数的含义是:

input_data: FFmpeg以字节形式处理(音频、视频等)等输入数据

stdout: 将FFmpeg重定向stdout到的位置。默认为None,意味着没有重定向

stderr: 将 FFmpeg 重定向stderr到的位置。默认为None,意味着没有重定向。

其他的方法,比如cmd方法是打印执行的ffmpeg命令。

ffmpy的使用

下面以webm格式的视频转码成mp4的视频为例。

原始命令是:ffmpeg -y -i D:\ffmpeg_test\1.webm -r 30 D:\ffmpeg_test\1.mp4

1. webm转mp4直接执行ffmpeg的写法是:

import os def webm2mp4(): command = "ffmpeg -y -i D:\ffmpeg_test\1.webm -r 30 D:\ffmpeg_test\1.mp4" os.system(command)

2. webm转mp4通过ffmpy执行的写法是:

from ffmpy import FFmpeg def webm_to_mp4(): ff = FFmpeg(inputs={'D:\ffmpeg_test\1.webm': '-y'}, outputs={'D:\ffmpeg_test\1.mp4': ' -r 30'}) ff.run()

3.多个视频合并

# ffmpeg -f concat -safe 0 -y -i D:\ffmpeg_test\filelist.txt -c copy -strict -2 D:\ffmpeg_test\concated.mp4 ff = FFmpeg( inputs={'D:\ffmpeg_test\filelist.txt': ' -f concat -safe 0 -y '}, outputs={'D:\ffmpeg_test\concated.mp4': ' -c copy -strict -2 '}) ff.run()

4. 视频剪切

# ffmpeg -ss 15 -t 25 -i D:\ffmpeg_test\concated.mp4 -c:v libx264 -c:a aac -strict experimental D:\ffmpeg_test\clip.mp4 ff = FFmpeg(inputs={'D:\ffmpeg_test\concated.mp4': '-ss 15 -t 25'}, outputs={'D:\ffmpeg_test\clip.mp4': '-c:v libx264 -c:a aac -strict experimental'}) ff.run()

来自实践中的教训,有时候纯ffmpeg命令并不好使,还得需要ffmpy包装器

在实际开发中远远没有这么简单,视频剪切的开始时间和结束时间都是可变的。另外就是输入文件和输出文件的地址也是可变的。那么在这种情况下,代码该如何写呢?这里主要涉及到一个入参的问题。下面做做一个演示:

第一种方式,将开始时间和时长放在global_options参数中

start = 15 end = 25 video_input_path = 'D:\\ffmpeg_test\\concated.mp4' video_output_path = 'D:\\ffmpeg_test\\clip.mp4' ff = FFmpeg(global_options={" -ss {0} -t {1}".format(start, end)}, inputs={video_input_path: '-y'}, outputs={video_output_path: " -c:v libx264 -c:a aac -preset ultrafast -strict experimental "}) ff.run()

第二种方式,将开始时间和时长作为输入操作,进行参数的传入。

start = 15 end = 25 video_input_path = 'D:\\ffmpeg_test\\concated.mp4' video_output_path = 'D:\\ffmpeg_test\\clip.mp4' ff = FFmpeg(inputs={video_input_path: " -ss {0} -t {1}".format(start, end)}, outputs={video_output_path: " -c:v libx264 -c:a aac -preset ultrafast -strict experimental "}) ff.run()

ffmpeg默认情况下是单个线程执行的,也就是说一个命令只有一个线程执行。如果要提高性能的话可以使用多线程执行。其命令参数是 -thread。比如改成5个线程执行,则命令是:

ff = FFmpeg(executable=ffmpeg.FFMPEG_PATH, global_options={" -ss {0} -t {1}".format(start, end)}, inputs={video_input_path: '-y'}, outputs={video_output_path: " -c:v libx264 -c:a aac -threads 5 -preset ultrafast -strict experimental "}) ff.run()

4.音频同轨

音频同轨涉及到两个输入文件,一个输出文件。所以inputs参数就有两个键值对。

# ffmpeg -y -i D:\\ffmpeg_test\\org_video_sound_input.wav -i D:\\ffmpeg_test\\org_voice_input.wav -filter_complex amix=inputs=2:duration=longest D:\\ffmpeg_test\\org_voice_output.wav sound1_path = 'D:\\ffmpeg_test\\org_video_sound_input.wav' sound2_path = 'D:\\ffmpeg_test\\org_voice_input.wav' sound_concated_path = 'D:\\ffmpeg_test\\org_voice_output.wav' ff = FFmpeg(inputs={sound1_path: '-y', sound2_path: None}, outputs={sound_concated_path: ' -filter_complex amix=inputs=2:duration=longest '}) ff.run()

总结

本文详细介绍了ffmpy的使用,希望对读者朋友们有所帮助。

我是码农飞哥,再次感谢您读完本文。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gLjACjLb-1629712012256)(./attachments/1629699514774.drawio.html)]

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:tornado中使用异步
下一篇:NumPy 和 sklearn入门
相关文章