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

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

时间:2022-11-28 14:34:30浏览次数:71  
标签:FFmpeg 包装 mp4 ffmpy test path ffmpeg


您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦
本文是ffmpeg使用的第二篇文章,主要是关于ffmpy的使用。
干货满满,建议收藏,需要用到时常看看。 小伙伴们如有问题及需要,欢迎踊跃留言哦~ ~ ~。

文章目录

  • ​​前言​​
  • ​​ffmpy库的引入​​
  • ​​ffmpy官方文档的地址​​
  • ​​ffmpy的介绍​​
  • ​​FFmpeg类的构造方法​​
  • ​​FFmpeg的run方法​​
  • ​​ffmpy的使用​​
  • ​​1. webm转mp4直接执行ffmpeg的写法是:​​
  • ​​2. webm转mp4通过ffmpy执行的写法是:​​
  • ​​3.多个视频合并​​
  • ​​4. 视频剪切​​
  • ​​4.音频同轨​​
  • ​​总结​​
  • ​​Python知识图谱​​

前言

如果对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类的实例。其各个参数的含义是:

  1. executable指的是查找ffmpeg的命令,默认情况下从环境变量PATH中取ffmpeg命令,如果没有配置环境变量的话,则覆盖execuable,传入ffmpeg程序的绝对路径。
  2. global_options:指的是ffmpeg命令的全局命令参数,比如:-y,-v等等
  3. inputs(dict): 传入的是一个字典,key为输入文件的地址,value为对输入文件的操作命令参数。默认情况下是带有 -i 命令参数的。
  4. outputs (dict): 传入的是一个字典,key为输出文件的地址,value为对输出文件的操作命令参数。

FFmpeg的run方法

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

  1. input_data: FFmpeg以字节形式处理(音频、视频等)等输入数据
  2. stdout: 将FFmpeg重定向stdout到的位置。默认为None,意味着没有重定向
  3. 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()

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

  1. 第一种方式,将开始时间和时长放在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()
  1. 第二种方式,将开始时间和时长作为输入操作,进行参数的传入。
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的使用,希望对读者朋友们有所帮助。



标签:FFmpeg,包装,mp4,ffmpy,test,path,ffmpeg
From: https://blog.51cto.com/u_15365215/5891169

相关文章

  • FFmpeg: 网页播放Venice.m3u8
     <!DOCTYPEhtml><html><head> <metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><metahttp-equiv="X-......
  • ffmpeg-工程编译
    define__STDC_CONSTANT_MACROS编写cmakelist支持需要的ffmpeg库CMakeLists.txtcmake_minimum_required(VERSION3.17)project(ffmpeg_demo)#设置ffmpeg依赖......
  • java包装类
    packagecom.Lucky.OftenClass;/*包装类:1.为了解决现实中将基本数据类型转换成对象,以便操作【java。lang】2.实现字符串与基本数据类型之间的转换......
  • 实体类编写时需要注意的细节——为什么字段需要用包装类型而不用基本数据类型
    最近在学习做微服务的项目,总结了一些平常没有注意到的细节,记录于此实体类涉及到的属性如果是int这样的基本数据类型,那么要使用其包装类型,因为包装类型默认为null,而基本......
  • python-将一个原有的winform程序包装成web服务
    历史遗留下来的程序,可能没有提供编程接口,但是又需要将这个程序的功能被其它代码调用。刚好做了类似一个系统间集成的例子。Web形式的OA要集成原有winform的短信息发送......
  • Python 调用中控门禁并包装成webservice供移动设备调用。
    前段时间做了个小试验,用Python调用中控门禁并包装成webservice供移动设备调用。移动端用的是泛微的OA企业微信端。实现手机远程开门效果,拿着手机,走到哪,哪的门就自动开了,很......
  • 通过调用ffmpeg来将mp3和jpg合并为mp4视频-批处理。
     听歌练乐器的时候想同时看一下简谱,没找到好用的app,自己动手写个批处理。只要把找到的歌(mp3文件)和谱(jpg文件)改成同名,并执行下面批处理,就能自动合并为视频。音遍就歌,画......
  • 一、FFmpeg 的初尝试《FFmpeg 音视频开发基础入门到实战》
    学习目标了解FFmpeg学习FFmpeg工具的下载及环境配置了解FFmpeg工具的使用方式了解FFmpegplay的使用方法了解FFmpegpaly的音量设置、窗口设置、音量设置等......
  • 配置案例|RS232转Profinet网关接包装扫码器
    本文主要介绍小疆智控(北京)技术有限公司生产的RS232转Profinet网关(产品型号:GW-PN5002)在计扫外包装中条码扫描方面的使用方法。案例说明:小疆智控生产的RS232转Profinet网......
  • ffmpeg-视频转图片
    视频转图片ffmpeg-i1.mp4-r5-fimage2.\output\1_frame_%05d.bmp"-r5"代表一秒中抽取五帧“image2”代表图片的类型,“%05d”代表五位的数,如“00001”输出图......