FFmpeg python wrapper for human, with common filters built in.
Project description
dayu_ffmpeg
===========
|pypi| |python| |build status| |github license|
dayu_ffmpeg 是针对ffmpeg 命令行的python 封装。 ffmpeg
的功能相当强大,但是复杂的终端指令往往让人无法使用。dayu_ffmpeg
正好解决了这个问题。 用户可以使用简单的 “流”
的概念搭建自己的处理方式,同时具有下面的特点:
- 通过 >> 运算符,表示stream 的操作
- 拥有ad-hoc 和network 两种操作模式
- 支持ffmpeg complex filter
- 如果用户需要使用的filter 不在默认的filter class 中,可以自行扩展
- 可以将Root Node 保存为ffscipt 的json
格式,方便保存硬盘文件或者是网络通信
ad-hoc 模式
===========
在ad-hoc 模式下,用户可以直接使用节点进行串行操作。
例如,用户希望对一个mov 素材进行下面的操作:
- 绘制2.39 的遮幅
- 缩放到1920x1080 的尺寸
- 写入内嵌reel
- 写入内嵌timecode
- 渲染输出到prores 422 的mov
如果直接使用ffmpeg,那么终端指令会是:
.. code:: shell
"ffmpeg" -y -i "/some/input/file.mov" -filter_complex "[0]drawbox=x=-t:y=0:w=iw+t*2:h=ih:c=black:t=(ih-(iw/2.39))/2[v0],[v0]scale=w=1920:h=1080[v1]" -map [v1] -metadata:s:v:0 reel_name=reelname -timecode 11:22:11:22 -codec:v prores_ks "/some/output/file.mov"
如果使用了dayu_ffmpeg,就会非常的直观。用户将自己的需要的操作一一写入皆可:
.. code:: python
from dayu_ffmpeg input *
result = Input('/some/input/file.mov') >> \
Drawmask(2.39) >> \
Scale(1920, 1080) >> \
Writereel('reelname') >> \
Writetimecode('11:22:11:22') >> \
Codec(video='prores_ks') >> \
Output('/some/output/file.mov')
需要注意的是,在ad-hoc 模式下,只能够支持串行的操作。
也就是说所有的节点都只能拥有一个输入和一个输出。
如果想要使用更加复杂的转码,请使用network 模式
network 模式
============
netowrk 模式会比ad-hoc
复杂一点,但是可以实现更加复杂的转码结构。并且一旦TD 写好了一个network,
那么后续的用户在使用上就非常的简单,相当于提供了一个 “转码模板”。
.. code:: python
from dayu_ffmpeg import *
class TranscodeTemplate(RootNode):
def prepare(self):
# 用户只需要重载prepare() 函数,在这里组织好网络结构
# 留好InputHolder 或者OutputHolder 作为 "接口"
ih1 = self.create_node(InputHolder)
i2 = self.create_node(Input('some_logo.png'))
cf = self.create_node(ComplexFilterGroup)
ih2 = cf.create_node(InputHolder)
ih3 = cf.create_node(InputHolder)
cf.set_input(ih1, 0)
cf.set_input(i2, 1)
over = cf.create_node(Overlay)
over.set_input(ih2, 0)
over.set_input(ih3, 1)
fit = cf.create_node(Fit())
fit.set_input(over)
oh1 = cf.create_node(OutputHolder)
oh1.set_input(fit)
oh2 = self.create_node(OutputHolder)
oh2.set_input(cf)
if __name__ == '__main__':
# 实例化转码的网络
template_root = TranscodeTemplate(name='overlay logo, then fit in HD, finally export to mov')
# 创建输入、输出
input1 = Input('some_input_file.mov')
output1 = Output('some_output_file.mov')
# 用户直接调用,就完成了整个转码,相当于调用"模板"
network_mode_cmd = template_root(input_list=[input1], output_list=[output1])
print network_mode_cmd.cmd()
使用自定义filter
================
如果默认的filter
中不存在需要使用的filter。用户可以有下面的几种方法自行扩展:
- 调用GeneralUnaryFilter
- 继承BaseFilterNode class,自行实现
- 继承BasePackedFilterNode, 将多种filter 进行打包,形成新的一个filter
调用GeneralUnaryFilter:
.. code:: python
command = Input('/some/input/file.mov') >> \
GeneralUnaryFilter('drawgrid', x=0, y=0, w=100, h=50) >> \
Output('/custom/filter/output.mov')
继承BaseFilterNode class,自行实现:
.. code:: python
class Null(BaseFilterNode):
# 设置特定的type,要保证唯一性
type = 'some_ffmpeg_filter_name'
# 重载init,实现自己的参数
def __init__(self, **kwargs):
super(Null, self).__init__(**kwargs)
# 重载 simple_cmd_string,返回对应的ffmpeg 指令string
def simple_cmd_string(self):
self._cmd = u'null'
return self._cmd
继承BasePackedFilterNode, 将多种filter 进行打包,形成新的一个filter。
可以参看 Fit 这个class 的实现方式。
查看shell 指令 以及运行
=======================
用户可以查看生成的shell 指令,或者直接运行:
.. code:: python
# 查看将要运行的终端指令
print command.cmd()
# 组装filter 之后,即可运行命令
for progress in command.run():
try:
print progress # 通过yield 返回渲染进度的dict,用户可以自行实现非阻塞进度条
except Exception as e:
raise # 如果指令错误,会抛出异常
ffscript 的保存和读取
=====================
ffscript 是dayu_ffmpeg 对于network 结构的一种json
表现形式,可以认为是“工程文件”。 如果想要把组成的network
保存到硬盘上,或是通过网络通信进行传递,就会使用到。
保存ffscript:
.. code:: python
from dayu_ffmpeg.ffscript import save_script, open_script
# 保存
save_script(netowrk_node_instance, '/some/script/path.json')
# 读取
transcode_template = open_script('/some/script/path.json')
.. |pypi| image:: https://img.shields.io/badge/pypi-0.5-blue.svg
:target: https://pypi.org/project/dayu-ffmpeg/
.. |python| image:: https://img.shields.io/badge/python-2.7-blue.svg
:target:
.. |build status| image:: https://travis-ci.org/phenom-films/dayu_ffmpeg.svg?branch=master
:target: https://travis-ci.org/phenom-films/dayu_ffmpeg
.. |github license| image:: https://img.shields.io/github/license/mashape/apistatus.svg
:target: https://github.com/phenom-films/dayu_ffmpeg/blob/master/license
===========
|pypi| |python| |build status| |github license|
dayu_ffmpeg 是针对ffmpeg 命令行的python 封装。 ffmpeg
的功能相当强大,但是复杂的终端指令往往让人无法使用。dayu_ffmpeg
正好解决了这个问题。 用户可以使用简单的 “流”
的概念搭建自己的处理方式,同时具有下面的特点:
- 通过 >> 运算符,表示stream 的操作
- 拥有ad-hoc 和network 两种操作模式
- 支持ffmpeg complex filter
- 如果用户需要使用的filter 不在默认的filter class 中,可以自行扩展
- 可以将Root Node 保存为ffscipt 的json
格式,方便保存硬盘文件或者是网络通信
ad-hoc 模式
===========
在ad-hoc 模式下,用户可以直接使用节点进行串行操作。
例如,用户希望对一个mov 素材进行下面的操作:
- 绘制2.39 的遮幅
- 缩放到1920x1080 的尺寸
- 写入内嵌reel
- 写入内嵌timecode
- 渲染输出到prores 422 的mov
如果直接使用ffmpeg,那么终端指令会是:
.. code:: shell
"ffmpeg" -y -i "/some/input/file.mov" -filter_complex "[0]drawbox=x=-t:y=0:w=iw+t*2:h=ih:c=black:t=(ih-(iw/2.39))/2[v0],[v0]scale=w=1920:h=1080[v1]" -map [v1] -metadata:s:v:0 reel_name=reelname -timecode 11:22:11:22 -codec:v prores_ks "/some/output/file.mov"
如果使用了dayu_ffmpeg,就会非常的直观。用户将自己的需要的操作一一写入皆可:
.. code:: python
from dayu_ffmpeg input *
result = Input('/some/input/file.mov') >> \
Drawmask(2.39) >> \
Scale(1920, 1080) >> \
Writereel('reelname') >> \
Writetimecode('11:22:11:22') >> \
Codec(video='prores_ks') >> \
Output('/some/output/file.mov')
需要注意的是,在ad-hoc 模式下,只能够支持串行的操作。
也就是说所有的节点都只能拥有一个输入和一个输出。
如果想要使用更加复杂的转码,请使用network 模式
network 模式
============
netowrk 模式会比ad-hoc
复杂一点,但是可以实现更加复杂的转码结构。并且一旦TD 写好了一个network,
那么后续的用户在使用上就非常的简单,相当于提供了一个 “转码模板”。
.. code:: python
from dayu_ffmpeg import *
class TranscodeTemplate(RootNode):
def prepare(self):
# 用户只需要重载prepare() 函数,在这里组织好网络结构
# 留好InputHolder 或者OutputHolder 作为 "接口"
ih1 = self.create_node(InputHolder)
i2 = self.create_node(Input('some_logo.png'))
cf = self.create_node(ComplexFilterGroup)
ih2 = cf.create_node(InputHolder)
ih3 = cf.create_node(InputHolder)
cf.set_input(ih1, 0)
cf.set_input(i2, 1)
over = cf.create_node(Overlay)
over.set_input(ih2, 0)
over.set_input(ih3, 1)
fit = cf.create_node(Fit())
fit.set_input(over)
oh1 = cf.create_node(OutputHolder)
oh1.set_input(fit)
oh2 = self.create_node(OutputHolder)
oh2.set_input(cf)
if __name__ == '__main__':
# 实例化转码的网络
template_root = TranscodeTemplate(name='overlay logo, then fit in HD, finally export to mov')
# 创建输入、输出
input1 = Input('some_input_file.mov')
output1 = Output('some_output_file.mov')
# 用户直接调用,就完成了整个转码,相当于调用"模板"
network_mode_cmd = template_root(input_list=[input1], output_list=[output1])
print network_mode_cmd.cmd()
使用自定义filter
================
如果默认的filter
中不存在需要使用的filter。用户可以有下面的几种方法自行扩展:
- 调用GeneralUnaryFilter
- 继承BaseFilterNode class,自行实现
- 继承BasePackedFilterNode, 将多种filter 进行打包,形成新的一个filter
调用GeneralUnaryFilter:
.. code:: python
command = Input('/some/input/file.mov') >> \
GeneralUnaryFilter('drawgrid', x=0, y=0, w=100, h=50) >> \
Output('/custom/filter/output.mov')
继承BaseFilterNode class,自行实现:
.. code:: python
class Null(BaseFilterNode):
# 设置特定的type,要保证唯一性
type = 'some_ffmpeg_filter_name'
# 重载init,实现自己的参数
def __init__(self, **kwargs):
super(Null, self).__init__(**kwargs)
# 重载 simple_cmd_string,返回对应的ffmpeg 指令string
def simple_cmd_string(self):
self._cmd = u'null'
return self._cmd
继承BasePackedFilterNode, 将多种filter 进行打包,形成新的一个filter。
可以参看 Fit 这个class 的实现方式。
查看shell 指令 以及运行
=======================
用户可以查看生成的shell 指令,或者直接运行:
.. code:: python
# 查看将要运行的终端指令
print command.cmd()
# 组装filter 之后,即可运行命令
for progress in command.run():
try:
print progress # 通过yield 返回渲染进度的dict,用户可以自行实现非阻塞进度条
except Exception as e:
raise # 如果指令错误,会抛出异常
ffscript 的保存和读取
=====================
ffscript 是dayu_ffmpeg 对于network 结构的一种json
表现形式,可以认为是“工程文件”。 如果想要把组成的network
保存到硬盘上,或是通过网络通信进行传递,就会使用到。
保存ffscript:
.. code:: python
from dayu_ffmpeg.ffscript import save_script, open_script
# 保存
save_script(netowrk_node_instance, '/some/script/path.json')
# 读取
transcode_template = open_script('/some/script/path.json')
.. |pypi| image:: https://img.shields.io/badge/pypi-0.5-blue.svg
:target: https://pypi.org/project/dayu-ffmpeg/
.. |python| image:: https://img.shields.io/badge/python-2.7-blue.svg
:target:
.. |build status| image:: https://travis-ci.org/phenom-films/dayu_ffmpeg.svg?branch=master
:target: https://travis-ci.org/phenom-films/dayu_ffmpeg
.. |github license| image:: https://img.shields.io/github/license/mashape/apistatus.svg
:target: https://github.com/phenom-films/dayu_ffmpeg/blob/master/license
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
dayu_ffmpeg-0.5.tar.gz
(16.2 kB
view hashes)
Built Distribution
Close
Hashes for dayu_ffmpeg-0.5-py2.py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8de6d1420453071c9c5e42b69814f2d4c69cb69a3a4573734975d37e7d0c860f |
|
MD5 | e4a83887a34ed774d1e4663eb77730ed |
|
BLAKE2b-256 | 6ca2fb354f8a24e97d6dace4d124417c61f04b16e1e34c8a05f908c2b2b27f57 |