ffmpy3与ffmpeg的简单使用

安装

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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/490708.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5G将改变技术格局的8个原因(上)

来源:CESAsia5G是引领第四次工业革命的通用技术。为了说明5G如何推动技术创新的飞跃,威讯(Verizon)首席执行官卫翰思(Hans Vestberg)在2019年国际消费电子产品展(CES 2019)主题演讲中罗列了5G所带来的八项有可能改变世界的能力。通用能力1和2&#xff1a…

matlab频谱分析_罗德与施瓦茨两款新的信号和频谱分析仪 具有多种频率型号

射频元器件、发射机和模组的制造商正面临着复杂的宽带射频信号测量任务和严苛的上市时间要求。特别是随着5G NR技术的进步,工程师在研发和生产中需要使用支持5G带宽和RF需求的测试解决方案分析无线通信信号。罗德与施瓦茨的新型中档信号和频谱分析仪R&SFSV3000和…

ArcEngine一些代码实现(转载)

转自:http://xitong.iteye.com/blog/1715759 ArcEngine 一些实现代码 ●● 目录: A1 …………实现:鼠标滑过显示要素 tip A2 …………实现:通过鼠标选择要素并高亮显示(ISelectionEnvironment) A3 ……………

tensorboard可视化经常出现的两个问题

tensorboard经常出现的两个问题 TensorFlow经常使用tf.summary.FileWriter("路径", sess.graph)函数将训练的图信息保存到日志中 使用TensorBoard读取读取并展示日志,使用如下语句: tensorboard --logdir日志所在路径 一、OSError: [Errn…

从电报到5G,细说60年移动通信史的7个变革

来源:司南物联今天,我们不止介绍5G,还要给大家介绍通信史这60多年来的趣事。电话“发明者”贝尔居然是小偷?早在1871年,意大利人安东尼奥梅乌奇就开始为自己的Teletrofono电话系统去申请专利,他花10美元买了…

联通5g接入点设置参数_联通5G 所向无前

10月31日,正值联通5G商用1周年的日子,上海联通自商用上市之初便策划推出“联通5G点亮全城”系列活动,践行“让每个市民在第一时间感受5G的脉搏”。北区分公司延续联通5G点亮全城的热度、结合S10英雄联盟总决赛契机,在Nice奈锶电竞…

mAP与IOU的简单介绍

mAP 在评价一个检测算法的时候,主要看两个标准,即是否正确预测了框内的物体类别;预测的框和人工标注框的重合程度。这两个的量化指标分别是mAP(mean Average Precision)和IOU(Intersection Over Union&…

海外又曝出伪AI明星公司!人工智能是个巨大泡沫?

来源: 维识教育科技昨日,《华尔街日报》曝光了一家印度伪AI明星公司Engineer.ai。这家总部设在美国洛杉矶和英国伦敦的公司,一直以来都声称:使用AI技术在很大程度上实现了移动App的自动化开发。在2018年11月,Engineer.…

无法安装64位版本的office,因为在您的PC上找到了以下32位程序:microsoft visio professional 2013

这是因为卸载microsoft visio professional 2013时没有卸载干净,即残留了注册表 解决方法: 鼠标按win标识R,打开运行对话框,输入:regedit找到键值:HKEY_CLASSES_ROOT点击:HKEY_CLASSES_ROOT&a…

踩内存是什么意思啊_网络资讯:0x0000008e蓝屏代码是什么

今天来说一下0x0000008e蓝屏代码是什么这方面的一些讯息,不少朋友对0x0000008e蓝屏代码是什么这方面的一些讯息颇感兴趣的,小编今天就整理了一些信息,希望对有需要的朋友有所帮助。0x0000008e 蓝屏代码所代表的意思为“内存错误”、“软件不兼…

利用卷积神经网络实现人脸识别(python+TensorFlow)

利用CNN卷积神经网络实现人脸识别(pythonTensorFlow) 使用的人脸数据是耶鲁大学的一个人脸数据集Yale_64x64.mat,数据集已经上传Yale 64x64.mat 程序: 使用Yale_64x64.mat人脸数据,利用CNN卷积神经网络实现人脸识别 …

ant语法和规范

一、前言: 以前在做JavaEE项目的时候曾经听说过这个名字,但是由于没有用到,所以也没有去学习。最近在研究Android打包的时候,看了下build.xml文件,甚是迷糊,于是学习一下,稍有心得。 二、什么是…

苹果开发者_苹果优秀开发者实锤 微软VS Code将支持Apple Silicon

原标题:苹果优秀开发者实锤 微软VS Code将支持Apple Silicon【CNMO新闻】前不久,苹果正式推出搭载Apple M1芯片的Mac产品,至此Mac产品线也将采用ARM架构。产品发布会后没多久,微软Visual Studio Code团队发文称,旗下的…

芯片的二线战场:14nm与12nm争夺战

来源:半导体行业观察在半导体制造领域,10nm、7nm及更先进制程的竞争正在变得越来越不激烈,其主要原因自然是投入巨大、风险高,愿意进入的玩家越来越少,目前只剩下台积电、三星和英特尔这三家了,这里显然成为…

python+OpenCV检测条形码

今天看到一篇关于条形码检测的文章,还是存在一些问题的,昨天我陪朋友去取快递的时候,看到了关于条形码检测在现实场景中的应用,于是,便想着实现一波,并且对程序中的一些问题做了一些修改。 首先要确定调用…

快搜浏览器_让微软丢大脸的edge浏览器终于出新版了!

九月份,基于 Chromium 内核的全新微软 Edge 浏览器开启 Beta 版本的测试,我看到使用全新内核的edge浏览器,以及官方加入的 IE 模式、隐私工具等一些更好用的新功能后,我暂时放下用了很长时间的老版本的edge浏览器,投入…

逻辑回归实现多分类任务(python+TensorFlow+mnist)

逻辑回归实现多分类任务(pythonTensorFlowmnist) 逻辑回归是统计学中的一种经典方法,虽然叫回归,但在机器学习领域,逻辑回归通常情况下当成一个分类任务,softmax就是由其演变而来,逻辑回归一般用…

物理哲学和生物哲学的对抗

来源:科学技术哲学相对论革命在上一讲中,我们提到第二次科学革命始于18世纪后期的化学革命,它的两大标志是:1. 近代西方科学的古典科学传统和培根科学传统融合,西方科学现代化;2. 科学和技术结合&#xff0…

cpu开核_新锐龙让AMD重返巅峰,但逆袭的50年里这些CPU也不应忘记

AMD从成立至今无疑有着许多神奇的经历,比如其创始人一开始只能艰难地筹集到5000美元创业,到如今AMD成为一家年营业额达到65亿美元的公司,这位创始人创始人杰里.桑德斯也赋予了AMD永不放弃,永不投降的精神。曾有过无比辉煌的历史&a…

二隐层的神经网络实现MNIST数据集分类

二隐层的神经网络实现MNIST数据集分类 传统的人工神经网络包含三部分,输入层、隐藏层和输出层。对于一个神经网络模型的确定需要考虑以下几个方面: 隐藏层的层数以及各层的神经元数量各层激活函数的选择输入层输入数据的shape输出层神经元的数量以上神经…