安装

python ffmpy3与ffmpeg的安装

https://blog.csdn.net/qq_40962368/article/details/90748852

ffmpy3的介绍:

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

ffmpy3是一个用于FFmpeg的Python包装器,最初是从ffmpy项目派生出来的。它根据提供的参数及其各自的选项编译FFmpeg命令行,并使用Python的子进程执行它。

ffmpy3类似于FFmpeg使用的命令行方法。它可以读取任意数量的输入“文件”(常规文件、管道、网络流、抓取设备等),并写入任意数量的输出“文件”。有关FFmpeg命令行选项和参数如何工作的详细信息,请参阅FFmpeg文档。

ffmpy3支持FFmpeg的管道协议。这意味着可以将输入数据传递到stdin并从stdout获得输出数据。

目前,ffmpy3已经为ffmpeg和ffprobe命令提供了包装器,但是应该可以用它运行其他ffmpeg工具(例如ffserver)。

FFmpeg的简单使用

一、格式转换

最简单的用法例子是将媒体从一种格式转换为另一种格式(在本例中是从MP4转换为MPEG传输流),同时保留所有其他属性:

from ffmpy3 import FFmpeg
ff = FFmpeg(inputs={'test.mp4': None},outputs={'output.ts': None})
print(ff.cmd)
ff.run()

二、转码

如果同时我们想用不同的解码器重新编码视频和音频,我们必须指定额外的输出选项:

下面的例子:将音频编码为mp2格式,将视频编码为mpeg2video模式

from ffmpy3 import FFmpeg
# 这里a就是指audio,v就是指video
ff = FFmpeg(inputs={'test.mp4': None},outputs={'output.ts': '-c:a mp2 -c:v mpeg2video'})
print(ff.cmd)
ff.run()
ffmpeg -i test.mp4 -c:a mp2 -c:v mpeg2video output.tsInput #0, ogg, from 'test.mp4':Stream #0:1: Video: theora, yuv420p, 320x176, 25 fps, 25 tbr, 25 tbn, 25 tbcStream #0:2: Audio: vorbis, 48000 Hz, stereo, fltp, 160 kb/sStream mapping:Stream #0:1 -> #0:0 (theora (native) -> mpeg2video (native))Stream #0:2 -> #0:1 (vorbis (native) -> mp2 (native))Output #0, mpegts, to 'output.ts':Stream #0:0: Video: mpeg2video (Main), yuv420p, 320x176, q=2-31, 200 kb/s, 25 fps, 90k tbn, 25 tbcStream #0:1: Audio: mp2, 48000 Hz, stereo, s16, 384 kb/s

三、多路分解

一个更复杂的使用示例是将MPEG传输流解复用为单独的基本(音频和视频)流,并将它们保存在保存编解码器的MP4容器中(注意这里如何使用列表作为选项):

实现的效果就是音频与视频分离,音频放入了audio.mp4文件,视频在video.mp4文件

from ffmpy3 import FFmpeg
ff = FFmpeg(inputs={'input.ts': None},outputs={'video.mp4': ['-map', '0:0', '-c:a', 'copy', '-f', 'mp4'],'audio.mp4': ['-map', '0:1', '-c:a', 'copy', '-f', 'mp4']})
print(ff.cmd)
ff.run()

ffmpeg -i input.ts -map 0:0 -c:a copy -f mp4 video.mp4 -map 0:1 -c:a copy -f mp4 audio.mp4Output #1, mp4, to 'audio.mp4':Stream #1:0: Audio: mp2 (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 384 kb/sOutput #0, mp4, to 'video.mp4':Stream #0:0: Video: h264 (libx264) (avc1 / 0x31637661), yuv420p, 320x176 [SAR 1:1 DAR 20:11], q=-1--1, 25 fps, 12800 tbn, 25 tbc

注意:不能混合选项的表达式格式,也就是说,不能有包含空格字符串的列表,除非不含有列表,将命令行作为一个整体字符串,即:['-map', '0:0', '-c:a', 'copy', '-f', 'mp4'] 或 '-map 0:0 -c:a copy -f mp4'

四、多路复用

将多路视频和音频重新编码回MPEG传输流,即音频与视频的合成:

from ffmpy3 import FFmpeg
ff = FFmpeg(inputs={'video.mp4': None, 'audio.mp4': None},outputs={'output.ts': '-c:v h264 -c:a ac3'})
print(ff.cmd)
ff.run()
Stream mapping:Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))Stream #1:0 -> #0:1 (mp3 (mp3float) -> ac3 (native))

在某些情况下,必须保留输入和输出的顺序(例如使用FFmpeg -map选项时)。在这些情况下,使用常规Python字典将不起作用,因为它不能保持顺序。相反,使用OrderedDict。例如,我们希望将一个视频和两个音频流多路复用到一个MPEG传输流中,使用不同的编解码器对两个音频流进行重新编码。这里,我们使用OrderedDict来保存输入的顺序,以便它们匹配输出选项中的流的顺序:

from ffmpy3 import FFmpeg
from collections import OrderedDict
inputs = OrderedDict([('video.mp4', None), ('audio_1.mp3', None), ('audio_2.mp3', None)])
outputs = {'output.ts': '-map 0 -c:v h264 -map 1 -c:a:0 ac3 -map 2 -c:a:1 mp2'}
ff = FFmpeg(inputs=inputs, outputs=outputs)
print(ff.cmd)
ff.run()

简化输出后的结果为:

ffmpeg -i video.mp4 -i audio_1.mp3 -i audio_2.mp3 -map 0 -c:v h264 -map 1 -c:a:0 ac3 -map 2 -c:a:1 mp2 output.tsInput #0, mov,mp4,m4a,3gp,3g2,mj2, from 'video.mp4':Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 320x176 [SAR 1:1 DAR 20:11], 241 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)Input #1, mov,mp4,m4a,3gp,3g2,mj2, from 'audio_1.mp3':Stream #1:0(und): Audio: mp3 (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 384 kb/s (default)Input #2, mov,mp4,m4a,3gp,3g2,mj2, from 'audio_2.mp3':Stream #2:0(und): Audio: mp3 (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 384 kb/s (default)Stream mapping:Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))Stream #1:0 -> #0:1 (mp3 (mp3float) -> ac3 (native))Stream #2:0 -> #0:2 (mp3 (mp3float) -> mp2 (native))Output #0, mpegts, to 'output.ts':Stream #0:0(und): Video: h264 (libx264), yuv420p(progressive), 320x176 [SAR 1:1 DAR 20:11], q=-1--1, 25 fps, 90k tbn, 25 tbc (default)Stream #0:1(und): Audio: ac3, 48000 Hz, stereo, fltp, 192 kb/s (default)Stream #0:2(und): Audio: mp2, 48000 Hz, stereo, s16, 384 kb/s (default)

五、使用管道协议

ffmpy3可以从STDIN(standard input)读取输入,并将输出写入STDOUT(standard output)。这可以通过使用FFmpeg管道协议来实现。下面的示例从包含RGB格式原始视频帧的文件中读取数据,并通过STDIN将其传递给ffmpy3;ffmpy3将用H.264编码原始帧数据,并将其打包到一个MP4容器中,将输出传递给STDOUT(注意,必须使用子进程将STDOUT重定向到管道中。管道为stdout值,否则输出将丢失):

from ffmpy3 import FFmpeg
import subprocess
ff = FFmpeg(inputs={'pipe:0': '-f rawvideo -pix_fmt rgb24 -s:v 640x480'},outputs={'pipe:1': '-c:v h264 -f mp4'})
print(ff.cmd)
stdout, stderr = ff.run(input_data=open('rawvideo', 'rb').read(), stdout=subprocess.PIPE)

六、异步执行

在某些情况下,您可能不希望运行FFmpeg并阻塞等待结果,或者在应用程序中引入多线程。在这种情况下,使用asyncio进行异步执行是可能的。

也可以在不使用多线程或阻塞的情况下处理FFmpeg输出。

七、复杂命令行

FFmpeg命令行选项可能非常复杂,比如在使用过滤时。因此,理解使用ffmpy3构建命令行的一些规则非常重要。如果一个选项包含引号,则必须在没有引号的选项列表中作为单独的项指定。但是,如果选项使用一个字符串,则必须将被引用的选项的引号保存在字符串中:

from ffmpy3 import FFmpeg
ff = FFmpeg(inputs={'input.ts': None},outputs={'output.ts': ['-vf', 'adif=0:-1:0, scale=iw/2:-1']})
print(ff.cmd)
ff = FFmpeg(inputs={'input.ts': None},outputs={'output.ts': '-vf "adif=0:-1:0, scale=iw/2:-1"'})
print(ff.cmd)
ffmpeg -i input.ts -vf "adif=0:-1:0, scale=iw/2:-1" output.ts
ffmpeg -i input.ts -vf "adif=0:-1:0, scale=iw/2:-1" output.tsProcess finished with exit code 0

一个更复杂的例子是命令行,它将时间码烧录成视频:

ffmpeg -i input.ts -vf "drawtext=fontfile=/Library/Fonts/Verdana.ttf: timecode='09\:57\:00\:00': r=25: x=(w-tw)/2: y=h-(2*lh): fontcolor=white: box=1: boxcolor=0x00000000@1" -an output.ts

在ffmpy3中可以表示为:

from ffmpy3 import FFmpeg
ff = FFmpeg(inputs={'input.ts': None},outputs={'output.ts': ['-vf', "drawtext=fontfile=/Library/Fonts/Verdana.ttf: timecode='09\:57\:00\:00': r=25: x=(w-tw)/2: y=h-(2*lh): fontcolor=white: box=1: boxcolor=0x00000000@1", '-an']})
print(ff.cmd)

相同的命令行可以编译通过传递输出选项作为一个字符串,同时保留引号:

from ffmpy3 import FFmpeg
ff = FFmpeg(inputs={'input.ts': None},outputs={'output.ts': "-vf \"drawtext=fontfile=/Library/Fonts/Verdana.ttf: timecode='09\:57\:00\:00': r=25: x=(w-tw)/2: y=h-(2*lh): fontcolor=white: box=1: boxcolor=0x00000000@1\" -an"})
print(ff.cmd)

ffmpy3与ffmpeg的简单使用相关推荐

  1. python ffmpy3与FFmpeg的安装

    python  ffmpy3与FFmpeg的安装 安装命令: pip install ffmpy3 去官网下载FFmpeg,根据自身电脑版本下载相应安装包 http://ffmpeg.org/down ...

  2. linux 视频编辑 ffmpeg,ffmpeg转码视频真的好用!(ffmpeg的简单使用方法)

    说明 转码和编辑视频 今天用Android Studio(后面简称AS)里的模拟器给系统录屏,用来展示OpenGL可视化的东西,打算上传B站,后来发现AS只能保存webm格式和GIF格式的视频,并且文 ...

  3. ffmpeg 源代码简单分析 : avcodec_decode_video2()

    2019独角兽企业重金招聘Python工程师标准>>> 此前写了好几篇ffmpeg源代码分析文章,列表如下: 图解FFMPEG打开媒体的函数avformat_open_input f ...

  4. FFmpeg源代码简单分析:libavdevice的gdigrab

    ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...

  5. FFmpeg源代码简单分析:libavdevice的avdevice_register_all()

    ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...

  6. FFmpeg源代码简单分析:configure

    ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...

  7. FFmpeg源代码简单分析:makefile

    ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...

  8. FFmpeg源代码简单分析:libswscale的sws_getContext()

    ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...

  9. FFmpeg源代码简单分析:结构体成员管理系统-AVOption

    ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...

最新文章

  1. python课程设计报告总结-上海python课程设计报告数据处理
  2. python入门教程 官方-Python 入门指南
  3. OpenCV基本的SIMD的实例(附完整代码)
  4. 神奇的python(六)之python的串口操作(pyserial)
  5. html5怎么在画布怎么旋转,javascript – 如何旋转HTML5画布的现有内容?
  6. hdc mfc 画扇形图_canvas画扇形、饼图
  7. 常用库函数_跑马灯实验和我为什么使用库函数?
  8. JAVA-初步认识-第十四章-线程间通信-多生产者多消费者问题-JDK1.5新特性解决办法-范例...
  9. 条件变量对多线程求素数的改进
  10. GD32F103读写内部FLASH
  11. Linux:下载和安装
  12. 简易计算器数码管c语言,简易计算器(数码管显示)
  13. 开源OA的公文编辑器详解:公文格式和基本使用
  14. 经典语录-让心灵不再寂寞
  15. 一个定语修饰两个并列的名词。
  16. 设断点报错:Frames are not available
  17. 帕金森病的功能性脑连接障碍:一项5年的纵向研究
  18. dx绘制2d图像_在DirectX 中进行2D渲染
  19. 在中国在行其道的智慧城市,为何折戟多伦多
  20. 点击站AdBux--看广告赚美元

热门文章

  1. Linux查看指定进程占用mem,Linux查看占用mem的进程脚本
  2. 中文python笔记_Python学习笔记-基础篇
  3. 交通流元胞自动机模拟仿真 matlab源码_元胞自动机中的时间反演
  4. NLP十大研究方向Highlights!
  5. 「小公式」平均数与级数
  6. 领域应用 | 知识计算,华为云赋能企业知识化转型
  7. 信息检索IR评价中常见的评价指标-MAP\NDCG\ERR\P@10等
  8. Python学习练习:批量移动文件
  9. String源码分析
  10. day35-mysql之表的详细操作