-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathindex.html
More file actions
438 lines (391 loc) · 48.5 KB
/
index.html
File metadata and controls
438 lines (391 loc) · 48.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
<!DOCTYPE html>
<html class="writer-html5" lang="en" data-content_root="./">
<head>
<meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>ffmpegio-core: Media I/O with FFmpeg in Python — python-ffmpegio 0.11.0 documentation</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=80d5e7a1" />
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=e59714d7" />
<link rel="stylesheet" type="text/css" href="_static/plot_directive.css" />
<link rel="stylesheet" type="text/css" href="_static/css/custom.css?v=048f17f8" />
<script src="_static/jquery.js?v=5d32c60e"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
<script src="_static/documentation_options.js?v=f3b36f1a"></script>
<script src="_static/doctools.js?v=9bcbadda"></script>
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="_static/js/theme.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="#" class="icon icon-home">
python-ffmpegio
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
<!-- Local TOC -->
<div class="local-toc"><ul>
<li><a class="reference internal" href="#"><cite>ffmpegio-core</cite>: Media I/O with FFmpeg in Python</a><ul>
<li><a class="reference internal" href="#main-features">Main Features</a></li>
<li><a class="reference internal" href="#installation">Installation</a></li>
<li><a class="reference internal" href="#documentation">Documentation</a></li>
<li><a class="reference internal" href="#examples">Examples</a><ul>
<li><a class="reference internal" href="#transcoding">Transcoding</a></li>
<li><a class="reference internal" href="#read-audio-files">Read Audio Files</a></li>
<li><a class="reference internal" href="#read-image-files-capture-video-frames">Read Image Files / Capture Video Frames</a></li>
<li><a class="reference internal" href="#read-video-files">Read Video Files</a></li>
<li><a class="reference internal" href="#read-multiple-files-or-streams">Read Multiple Files or Streams</a></li>
<li><a class="reference internal" href="#write-audio-image-video-files">Write Audio, Image, & Video Files</a></li>
<li><a class="reference internal" href="#filter-audio-image-video-data">Filter Audio, Image, & Video Data</a></li>
<li><a class="reference internal" href="#stream-i-o">Stream I/O</a></li>
<li><a class="reference internal" href="#filtergraph-builder">Filtergraph Builder</a></li>
<li><a class="reference internal" href="#device-i-o-enumeration">Device I/O Enumeration</a></li>
<li><a class="reference internal" href="#progress-callback">Progress Callback</a></li>
<li><a class="reference internal" href="#run-ffmpeg-and-ffprobe-directly">Run FFmpeg and FFprobe Directly</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="#">python-ffmpegio</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="Page navigation">
<ul class="wy-breadcrumbs">
<li><a href="#" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item active"><cite>ffmpegio-core</cite>: Media I/O with FFmpeg in Python</li>
<li class="wy-breadcrumbs-aside">
<a href="_sources/index.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<section id="ffmpegio-core-media-i-o-with-ffmpeg-in-python">
<h1><cite>ffmpegio-core</cite>: Media I/O with FFmpeg in Python<a class="headerlink" href="#ffmpegio-core-media-i-o-with-ffmpeg-in-python" title="Link to this heading"></a></h1>
<p><img alt="PyPI" src="https://img.shields.io/pypi/v/ffmpegio" /> <img alt="PyPI - Status" src="https://img.shields.io/pypi/status/ffmpegio" /> <img alt="PyPI - Python Version" src="https://img.shields.io/pypi/pyversions/ffmpegio" /> <img alt="GitHub License" src="https://img.shields.io/github/license/python-ffmpegio/python-ffmpegio" /> <img alt="GitHub Workflow Status" src="https://img.shields.io/github/actions/workflow/status/python-ffmpegio/python-ffmpegio/test_n_pub.yml?branch=main" /></p>
<p>Python <cite>ffmpegio</cite> package aims to bring the full capability of <a class="reference external" href="https://ffmpeg.org">FFmpeg</a>
to read, write, probe, and manipulate multimedia data to Python. FFmpeg is an open-source cross-platform
multimedia framework, which can handle most of the multimedia formats available today.</p>
<section id="main-features">
<h2>Main Features<a class="headerlink" href="#main-features" title="Link to this heading"></a></h2>
<ul class="simple">
<li><p>Pure-Python light-weight package interacting with FFmpeg executable found in
your system</p></li>
<li><p>Read, write, filter, and create functions for audio, image, and video data</p></li>
<li><p>Context-managing <cite>ffmpegio.open</cite> to perform stream read/write operations of video and audio</p></li>
<li><p>Media readers can output the data in a Numpy array (if Numpy is installed) or a plain <code class="code docutils literal notranslate"><span class="pre">bytes</span></code>
objects in a <code class="code docutils literal notranslate"><span class="pre">dict</span></code>. The mode of operation can be switched with <code class="code docutils literal notranslate"><span class="pre">ffmpegio.use</span></code> function.</p></li>
<li><p>Media writers can write a new media file from either data given in a Numpy array or <code class="code docutils literal notranslate"><span class="pre">bytes</span></code>
objects in a <code class="code docutils literal notranslate"><span class="pre">dict</span></code>.</p></li>
<li><p>Write Matplotlib figures to images or to a video (a simpler interface than Matplotlib’s Animation writers).</p></li>
<li><p>Probe media file information</p></li>
<li><p>Accepts all FFmpeg options including filter graphs</p></li>
<li><p>Transcode a media file to another in Python</p></li>
<li><p>Supports a user callback whenever FFmpeg updates its progress information file
(see <cite>-progress</cite> FFmpeg option)</p></li>
<li><p><cite>ffconcat</cite> scripter to make the use of <cite>-f concat</cite> demuxer easier</p></li>
<li><p>I/O device enumeration to eliminate the need to look up device names. (currently supports only: Windows DirectShow)</p></li>
<li><p>More features to follow</p></li>
</ul>
</section>
<section id="installation">
<h2>Installation<a class="headerlink" href="#installation" title="Link to this heading"></a></h2>
<p>Install the full <cite>ffmpegio</cite> package via <code class="docutils literal notranslate"><span class="pre">pip</span></code>:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>pip<span class="w"> </span>install<span class="w"> </span>ffmpegio
</pre></div>
</div>
<p>Following optional external packages are required to enable the <code class="code docutils literal notranslate"><span class="pre">ffmpegio</span></code> features that interact
with them.</p>
<table class="tight-table docutils align-default">
<thead>
<tr class="row-odd"><th class="head"><p>Distro package name</p></th>
<th class="head"><p><code class="code docutils literal notranslate"><span class="pre">ffmpegio</span></code> features</p></th>
<th class="head"><p>Deprecated plugin names</p></th>
</tr>
</thead>
<tbody>
<tr class="row-even"><td><p><code class="code docutils literal notranslate"><span class="pre">numpy</span></code></p></td>
<td><p>Support Numpy array inputs and outputs intead of bytes</p></td>
<td><p><code class="code docutils literal notranslate"><span class="pre">ffmpegio</span></code></p></td>
</tr>
<tr class="row-odd"><td><p><code class="code docutils literal notranslate"><span class="pre">matplotlib</span></code></p></td>
<td><p>Support generation of images or videos from Matplotlib figure</p></td>
<td><p><code class="code docutils literal notranslate"><span class="pre">ffmpegio-plugin-mpl</span></code></p></td>
</tr>
<tr class="row-even"><td><p><code class="code docutils literal notranslate"><span class="pre">ffmepeg-downloader</span></code></p></td>
<td><p>Support the FFmpeg binaries installed by the <code class="code docutils literal notranslate"><span class="pre">ffdl</span></code> command</p></td>
<td><p><code class="code docutils literal notranslate"><span class="pre">ffmpegio-plugin-downloader</span></code></p></td>
</tr>
<tr class="row-odd"><td><p><code class="code docutils literal notranslate"><span class="pre">static-ffmpeg</span></code></p></td>
<td><p>Support the FFmpeg binaries installed by <code class="code docutils literal notranslate"><span class="pre">static-ffmpeg</span></code></p></td>
<td><p><code class="code docutils literal notranslate"><span class="pre">ffmpegio-plugin-static-ffmpeg</span></code></p></td>
</tr>
</tbody>
</table>
<p>These features are automatically enabled if the external packages are installed along along side with <cite>ffmpegio</cite>.
<code class="code docutils literal notranslate"><span class="pre">ffmpegio</span></code> is imported</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>Prior to v0.11.0, these features were only enabled via installing separate plugin packages (listed in the table above).
<code class="code docutils literal notranslate"><span class="pre">ffmpegio</span></code> v0.11 and <code class="code docutils literal notranslate"><span class="pre">ffmpegio-core</span></code> v0.11 are identical, and <code class="code docutils literal notranslate"><span class="pre">ffmpegio-core</span></code> will no longer receive
the updates.</p>
</div>
</section>
<section id="documentation">
<h2>Documentation<a class="headerlink" href="#documentation" title="Link to this heading"></a></h2>
<p>Visit our <a class="reference external" href="https://python-ffmpegio.github.io/python-ffmpegio/">GitHub page here</a></p>
</section>
<section id="examples">
<h2>Examples<a class="headerlink" href="#examples" title="Link to this heading"></a></h2>
<p>To import <cite>ffmpegio</cite></p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">ffmpegio</span>
</pre></div>
</div>
<ul class="simple">
<li><p><a class="reference internal" href="#transcoding">Transcoding</a></p></li>
<li><p><a class="reference internal" href="#read-audio-files">Read Audio Files</a></p></li>
<li><p><a class="reference internal" href="#read-image-files-capture-video-frames">Read Image Files / Capture Video Frames</a></p></li>
<li><p><a class="reference internal" href="#read-video-files">Read Video Files</a></p></li>
<li><p><a class="reference internal" href="#read-multiple-files-or-streams">Read Multiple Files or Streams</a></p></li>
<li><p><a class="reference internal" href="#write-audio-image-video-files">Write Audio, Image, & Video Files</a></p></li>
<li><p><a class="reference internal" href="#filter-audio-image-video-data">Filter Audio, Image, & Video Data</a></p></li>
<li><p><a class="reference internal" href="#stream-i-o">Stream I/O</a></p></li>
<li><p><a class="reference internal" href="#device-i-o-enumeration">Device I/O Enumeration</a></p></li>
<li><p><a class="reference internal" href="#progress-callback">Progress Callback</a></p></li>
<li><p><a class="reference internal" href="#filtergraph-builder">Filtergraph Builder</a></p></li>
<li><p><a class="reference internal" href="#run-ffmpeg-and-ffprobe-directly">Run FFmpeg and FFprobe Directly</a></p></li>
</ul>
<section id="transcoding">
<h3>Transcoding<a class="headerlink" href="#transcoding" title="Link to this heading"></a></h3>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="c1"># transcode, overwrite output file if exists, showing the FFmpeg log</span>
<span class="gp">>>> </span><span class="n">ffmpegio</span><span class="o">.</span><span class="n">transcode</span><span class="p">(</span><span class="s1">'input.avi'</span><span class="p">,</span> <span class="s1">'output.mp4'</span><span class="p">,</span> <span class="n">overwrite</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">show_log</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="gp">>>> </span><span class="c1"># 1-pass H.264 transcoding</span>
<span class="gp">>>> </span><span class="n">ffmpegio</span><span class="o">.</span><span class="n">transcode</span><span class="p">(</span><span class="s1">'input.avi'</span><span class="p">,</span> <span class="s1">'output.mkv'</span><span class="p">,</span> <span class="n">vcodec</span><span class="o">=</span><span class="s1">'libx264'</span><span class="p">,</span> <span class="n">show_log</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="gp">>>> </span> <span class="n">preset</span><span class="o">=</span><span class="s1">'slow'</span><span class="p">,</span> <span class="n">crf</span><span class="o">=</span><span class="mi">22</span><span class="p">,</span> <span class="n">acodec</span><span class="o">=</span><span class="s1">'copy'</span><span class="p">)</span>
<span class="gp">>>> </span><span class="c1"># 2-pass H.264 transcoding</span>
<span class="gp">>>> </span><span class="n">ffmpegio</span><span class="o">.</span><span class="n">transcode</span><span class="p">(</span><span class="s1">'input.avi'</span><span class="p">,</span> <span class="s1">'output.mkv'</span><span class="p">,</span> <span class="n">two_pass</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">show_log</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="gp">>>> </span> <span class="o">**</span><span class="p">{</span><span class="s1">'c:v'</span><span class="p">:</span><span class="s1">'libx264'</span><span class="p">,</span> <span class="s1">'b:v'</span><span class="p">:</span><span class="s1">'2600k'</span><span class="p">,</span> <span class="s1">'c:a'</span><span class="p">:</span><span class="s1">'aac'</span><span class="p">,</span> <span class="s1">'b:a'</span><span class="p">:</span><span class="s1">'128k'</span><span class="p">})</span>
<span class="gp">>>> </span><span class="c1"># concatenate videos using concat demuxer</span>
<span class="gp">>>> </span><span class="n">files</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'/video/video1.mkv'</span><span class="p">,</span><span class="s1">'/video/video2.mkv'</span><span class="p">]</span>
<span class="gp">>>> </span><span class="n">ffconcat</span> <span class="o">=</span> <span class="n">ffmpegio</span><span class="o">.</span><span class="n">FFConcat</span><span class="p">()</span>
<span class="gp">>>> </span><span class="n">ffconcat</span><span class="o">.</span><span class="n">add_files</span><span class="p">(</span><span class="n">files</span><span class="p">)</span>
<span class="gp">>>> </span><span class="k">with</span> <span class="n">ffconcat</span><span class="p">:</span> <span class="c1"># generates temporary ffconcat file</span>
<span class="gp">>>> </span> <span class="n">ffmpegio</span><span class="o">.</span><span class="n">transcode</span><span class="p">(</span><span class="n">ffconcat</span><span class="p">,</span> <span class="s1">'output.mkv'</span><span class="p">,</span> <span class="n">f_in</span><span class="o">=</span><span class="s1">'concat'</span><span class="p">,</span> <span class="n">codec</span><span class="o">=</span><span class="s1">'copy'</span><span class="p">,</span> <span class="n">safe_in</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
</pre></div>
</div>
</section>
<section id="read-audio-files">
<h3>Read Audio Files<a class="headerlink" href="#read-audio-files" title="Link to this heading"></a></h3>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="c1"># read audio samples in its native sample format and return all channels</span>
<span class="gp">>>> </span><span class="n">fs</span><span class="p">,</span> <span class="n">x</span> <span class="o">=</span> <span class="n">ffmpegio</span><span class="o">.</span><span class="n">audio</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="s1">'myaudio.wav'</span><span class="p">)</span>
<span class="gp">>>> </span><span class="c1"># fs: sampling rate in samples/second, x: [nsamples x nchannels] numpy array</span>
<span class="gp">>>> </span><span class="c1"># read audio samples from 24.15 seconds to 63.2 seconds, pre-convert to mono in float data type</span>
<span class="gp">>>> </span><span class="n">fs</span><span class="p">,</span> <span class="n">x</span> <span class="o">=</span> <span class="n">ffmpegio</span><span class="o">.</span><span class="n">audio</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="s1">'myaudio.flac'</span><span class="p">,</span> <span class="n">ss</span><span class="o">=</span><span class="mf">24.15</span><span class="p">,</span> <span class="n">to</span><span class="o">=</span><span class="mf">63.2</span><span class="p">,</span> <span class="n">sample_fmt</span><span class="o">=</span><span class="s1">'dbl'</span><span class="p">,</span> <span class="n">ac</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="gp">>>> </span><span class="c1"># read filtered audio samples first 10 seconds</span>
<span class="gp">>>> </span><span class="c1"># filter: equalizer which attenuate 10 dB at 1 kHz with a bandwidth of 200 Hz</span>
<span class="gp">>>> </span><span class="n">fs</span><span class="p">,</span> <span class="n">x</span> <span class="o">=</span> <span class="n">ffmpegio</span><span class="o">.</span><span class="n">audio</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="s1">'myaudio.mp3'</span><span class="p">,</span> <span class="n">t</span><span class="o">=</span><span class="mf">10.0</span><span class="p">,</span> <span class="n">af</span><span class="o">=</span><span class="s1">'equalizer=f=1000:t=h:width=200:g=-10'</span><span class="p">)</span>
</pre></div>
</div>
</section>
<section id="read-image-files-capture-video-frames">
<h3>Read Image Files / Capture Video Frames<a class="headerlink" href="#read-image-files-capture-video-frames" title="Link to this heading"></a></h3>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="c1"># list supported image extensions</span>
<span class="gp">>>> </span><span class="n">ffmpegio</span><span class="o">.</span><span class="n">caps</span><span class="o">.</span><span class="n">muxer_info</span><span class="p">(</span><span class="s1">'image2'</span><span class="p">)[</span><span class="s1">'extensions'</span><span class="p">]</span>
<span class="go">['bmp', 'dpx', 'exr', 'jls', 'jpeg', 'jpg', 'ljpg', 'pam', 'pbm', 'pcx', 'pfm', 'pgm', 'pgmyuv',</span>
<span class="go"> 'png', 'ppm', 'sgi', 'tga', 'tif', 'tiff', 'jp2', 'j2c', 'j2k', 'xwd', 'sun', 'ras', 'rs', 'im1',</span>
<span class="go"> 'im8', 'im24', 'sunras', 'xbm', 'xface', 'pix', 'y']</span>
<span class="gp">>>> </span><span class="c1"># read BMP image with auto-detected pixel format (rgb24, gray, rgba, or ya8)</span>
<span class="gp">>>> </span><span class="n">I</span> <span class="o">=</span> <span class="n">ffmpegio</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="s1">'myimage.bmp'</span><span class="p">)</span> <span class="c1"># I: [height x width x ncomp] numpy array</span>
<span class="gp">>>> </span><span class="c1"># read JPEG image, then convert to grayscale and proportionally scale so the width is 480 pixels</span>
<span class="gp">>>> </span><span class="n">I</span> <span class="o">=</span> <span class="n">ffmpegio</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="s1">'myimage.jpg'</span><span class="p">,</span> <span class="n">pix_fmt</span><span class="o">=</span><span class="s1">'grayscale'</span><span class="p">,</span> <span class="n">s</span><span class="o">=</span><span class="s1">'480x-1'</span><span class="p">)</span>
<span class="gp">>>> </span><span class="c1"># read PNG image with transparency, convert it to plain RGB by filling transparent pixels orange</span>
<span class="gp">>>> </span><span class="n">I</span> <span class="o">=</span> <span class="n">ffmpegio</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="s1">'myimage.png'</span><span class="p">,</span> <span class="n">pix_fmt</span><span class="o">=</span><span class="s1">'rgb24'</span><span class="p">,</span> <span class="n">fill_color</span><span class="o">=</span><span class="s1">'orange'</span><span class="p">)</span>
<span class="gp">>>> </span><span class="c1"># capture video frame at timestamp=4:25.3 and convert non-square pixels to square</span>
<span class="gp">>>> </span><span class="n">I</span> <span class="o">=</span> <span class="n">ffmpegio</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="s1">'myvideo.mpg'</span><span class="p">,</span> <span class="n">ss</span><span class="o">=</span><span class="s1">'4:25.3'</span><span class="p">,</span> <span class="n">square_pixels</span><span class="o">=</span><span class="s1">'upscale'</span><span class="p">)</span>
<span class="gp">>>> </span><span class="c1"># capture 5 video frames and tile them on 3x2 grid with 7px between them, and 2px of initial margin</span>
<span class="gp">>>> </span><span class="n">I</span> <span class="o">=</span> <span class="n">ffmpegio</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="s1">'myvideo.mp4'</span><span class="p">,</span> <span class="n">vf</span><span class="o">=</span><span class="s1">'tile=3x2:nb_frames=5:padding=7:margin=2'</span><span class="p">)</span>
<span class="gp">>>> </span><span class="c1"># create spectrogram of the audio input (must specify pix_fmt if input is audio)</span>
<span class="gp">>>> </span><span class="n">I</span> <span class="o">=</span> <span class="n">ffmpegio</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="s1">'myaudio.mp3'</span><span class="p">,</span> <span class="n">filter_complex</span><span class="o">=</span><span class="s1">'showspectrumpic=s=960x540'</span><span class="p">,</span> <span class="n">pix_fmt</span><span class="o">=</span><span class="s1">'rgb24'</span><span class="p">)</span>
</pre></div>
</div>
</section>
<section id="read-video-files">
<h3>Read Video Files<a class="headerlink" href="#read-video-files" title="Link to this heading"></a></h3>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="c1"># read 50 video frames at t=00:32:40 then convert to grayscale</span>
<span class="gp">>>> </span><span class="n">fs</span><span class="p">,</span> <span class="n">F</span> <span class="o">=</span> <span class="n">ffmpegio</span><span class="o">.</span><span class="n">video</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="s1">'myvideo.mp4'</span><span class="p">,</span> <span class="n">ss</span><span class="o">=</span><span class="s1">'00:32:40'</span><span class="p">,</span> <span class="n">vframes</span><span class="o">=</span><span class="mi">50</span><span class="p">,</span> <span class="n">pix_fmt</span><span class="o">=</span><span class="s1">'gray'</span><span class="p">)</span>
<span class="gp">>>> </span><span class="c1"># fs: frame rate in frames/second, F: [nframes x height x width x ncomp] numpy array</span>
<span class="gp">>>> </span><span class="c1"># get running spectrogram of audio input (must specify pix_fmt if input is audio)</span>
<span class="gp">>>> </span><span class="n">fs</span><span class="p">,</span> <span class="n">F</span> <span class="o">=</span> <span class="n">ffmpegio</span><span class="o">.</span><span class="n">video</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="s1">'myvideo.mp4'</span><span class="p">,</span> <span class="n">pix_fmt</span><span class="o">=</span><span class="s1">'rgb24'</span><span class="p">,</span> <span class="n">filter_complex</span><span class="o">=</span><span class="s1">'showspectrum=s=1280x480'</span><span class="p">)</span>
</pre></div>
</div>
</section>
<section id="read-multiple-files-or-streams">
<h3>Read Multiple Files or Streams<a class="headerlink" href="#read-multiple-files-or-streams" title="Link to this heading"></a></h3>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="c1"># read both video and audio streams (1 ea)</span>
<span class="gp">>>> </span><span class="n">rates</span><span class="p">,</span> <span class="n">data</span> <span class="o">=</span> <span class="n">ffmpegio</span><span class="o">.</span><span class="n">media</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="s1">'mymedia.mp4'</span><span class="p">)</span>
<span class="gp">>>> </span><span class="c1"># rates: dict of frame rate and sampling rate: keys="v:0" and "a:0"</span>
<span class="gp">>>> </span><span class="c1"># data: dict of video frame array and audio sample array: keys="v:0" and "a:0"</span>
<span class="gp">>>> </span><span class="c1"># combine video and audio files</span>
<span class="gp">>>> </span><span class="n">rates</span><span class="p">,</span> <span class="n">data</span> <span class="o">=</span> <span class="n">ffmpegio</span><span class="o">.</span><span class="n">media</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="s1">'myvideo.mp4'</span><span class="p">,</span><span class="s1">'myaudio.mp3'</span><span class="p">)</span>
<span class="gp">>>> </span><span class="c1"># get output of complex filtergraph (can take multiple inputs)</span>
<span class="gp">>>> </span><span class="n">expr</span> <span class="o">=</span> <span class="s2">"[v:0]split=2[out0][l1];[l1]edgedetect[out1]"</span>
<span class="gp">>>> </span><span class="n">rates</span><span class="p">,</span> <span class="n">data</span> <span class="o">=</span> <span class="n">ffmpegio</span><span class="o">.</span><span class="n">media</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="s1">'myvideo.mp4'</span><span class="p">,</span><span class="n">filter_complex</span><span class="o">=</span><span class="n">expr</span><span class="p">,</span><span class="nb">map</span><span class="o">=</span><span class="p">[</span><span class="s1">'[out0]'</span><span class="p">,</span><span class="s1">'[out1]'</span><span class="p">])</span>
<span class="gp">>>> </span><span class="c1"># rates: dict of frame rates: keys="v:0" and "v:1"</span>
<span class="gp">>>> </span><span class="c1"># data: dict of video frame arrays: keys="v:0" and "v:1"</span>
</pre></div>
</div>
</section>
<section id="write-audio-image-video-files">
<h3>Write Audio, Image, & Video Files<a class="headerlink" href="#write-audio-image-video-files" title="Link to this heading"></a></h3>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="c1"># create a video file from a numpy array</span>
<span class="gp">>>> </span><span class="n">ffmpegio</span><span class="o">.</span><span class="n">video</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'myvideo.mp4'</span><span class="p">,</span> <span class="n">rate</span><span class="p">,</span> <span class="n">F</span><span class="p">)</span>
<span class="gp">>>> </span><span class="c1"># create an image file from a numpy array</span>
<span class="gp">>>> </span><span class="n">ffmpegio</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'myimage.png'</span><span class="p">,</span> <span class="n">F</span><span class="p">)</span>
<span class="gp">>>> </span><span class="c1"># create an audio file from a numpy array</span>
<span class="gp">>>> </span><span class="n">ffmpegio</span><span class="o">.</span><span class="n">audio</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'myaudio.mp3'</span><span class="p">,</span> <span class="n">rate</span><span class="p">,</span> <span class="n">x</span><span class="p">)</span>
</pre></div>
</div>
</section>
<section id="filter-audio-image-video-data">
<h3>Filter Audio, Image, & Video Data<a class="headerlink" href="#filter-audio-image-video-data" title="Link to this heading"></a></h3>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="c1"># Add fade-in and fade-out effects to audio data</span>
<span class="gp">>>> </span><span class="n">fs_out</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="n">ffmpegio</span><span class="o">.</span><span class="n">audio</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="s1">'afade=t=in:ss=0:d=15,afade=t=out:st=875:d=25'</span><span class="p">,</span> <span class="n">fs_in</span><span class="p">,</span> <span class="n">x</span><span class="p">)</span>
<span class="gp">>>> </span><span class="c1"># Apply mirror effect to an image</span>
<span class="gp">>>> </span><span class="n">I_out</span> <span class="o">=</span> <span class="n">ffmpegio</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="s1">'crop=iw/2:ih:0:0,split[left][tmp];[tmp]hflip[right];[left][right] hstack'</span><span class="p">,</span> <span class="n">I_in</span><span class="p">)</span>
<span class="gp">>>> </span><span class="c1"># Add text at the center of the video frame</span>
<span class="gp">>>> </span><span class="nb">filter</span> <span class="o">=</span> <span class="s2">"drawtext=fontsize=30:fontfile=FreeSerif.ttf:text='hello world':x=(w-text_w)/2:y=(h-text_h)/2"</span>
<span class="gp">>>> </span><span class="n">fs_out</span><span class="p">,</span> <span class="n">F_out</span> <span class="o">=</span> <span class="n">ffmpegio</span><span class="o">.</span><span class="n">video</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="nb">filter</span><span class="p">,</span> <span class="n">fs_in</span><span class="p">,</span> <span class="n">F_in</span><span class="p">)</span>
</pre></div>
</div>
</section>
<section id="stream-i-o">
<h3>Stream I/O<a class="headerlink" href="#stream-i-o" title="Link to this heading"></a></h3>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="c1"># process video 100 frames at a time and save output as a new video</span>
<span class="gp">>>> </span><span class="c1"># with the same frame rate</span>
<span class="gp">>>> </span><span class="k">with</span> <span class="n">ffmpegio</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s1">'myvideo.mp4'</span><span class="p">,</span> <span class="s1">'rv'</span><span class="p">,</span> <span class="n">blocksize</span><span class="o">=</span><span class="mi">100</span><span class="p">)</span> <span class="k">as</span> <span class="n">fin</span><span class="p">,</span>
<span class="gp">>>> </span> <span class="n">ffmpegio</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s1">'myoutput.mp4'</span><span class="p">,</span> <span class="s1">'wv'</span><span class="p">,</span> <span class="n">rate</span><span class="o">=</span><span class="n">fin</span><span class="o">.</span><span class="n">rate</span><span class="p">)</span> <span class="k">as</span> <span class="n">fout</span><span class="p">:</span>
<span class="gp">>>> </span> <span class="k">for</span> <span class="n">frames</span> <span class="ow">in</span> <span class="n">fin</span><span class="p">:</span>
<span class="gp">>>> </span> <span class="n">fout</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">myprocess</span><span class="p">(</span><span class="n">frames</span><span class="p">))</span>
</pre></div>
</div>
</section>
<section id="filtergraph-builder">
<h3>Filtergraph Builder<a class="headerlink" href="#filtergraph-builder" title="Link to this heading"></a></h3>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="c1"># build complex filtergraph</span>
<span class="gp">>>> </span><span class="kn">from</span> <span class="nn">ffmpegio</span> <span class="kn">import</span> <span class="n">filtergraph</span> <span class="k">as</span> <span class="n">fgb</span>
<span class="gp">>>></span>
<span class="gp">>>> </span><span class="n">v0</span> <span class="o">=</span> <span class="s2">"[0]"</span> <span class="o">>></span> <span class="n">fgb</span><span class="o">.</span><span class="n">trim</span><span class="p">(</span><span class="n">start_frame</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">end_frame</span><span class="o">=</span><span class="mi">20</span><span class="p">)</span>
<span class="gp">>>> </span><span class="n">v1</span> <span class="o">=</span> <span class="s2">"[0]"</span> <span class="o">>></span> <span class="n">fgb</span><span class="o">.</span><span class="n">trim</span><span class="p">(</span><span class="n">start_frame</span><span class="o">=</span><span class="mi">30</span><span class="p">,</span> <span class="n">end_frame</span><span class="o">=</span><span class="mi">40</span><span class="p">)</span>
<span class="gp">>>> </span><span class="n">v3</span> <span class="o">=</span> <span class="s2">"[1]"</span> <span class="o">>></span> <span class="n">fgb</span><span class="o">.</span><span class="n">hflip</span><span class="p">()</span>
<span class="gp">>>> </span><span class="n">v2</span> <span class="o">=</span> <span class="p">(</span><span class="n">v0</span> <span class="o">|</span> <span class="n">v1</span><span class="p">)</span> <span class="o">+</span> <span class="n">fgb</span><span class="o">.</span><span class="n">concat</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="gp">>>> </span><span class="n">v5</span> <span class="o">=</span> <span class="p">(</span><span class="n">v2</span><span class="o">|</span><span class="n">v3</span><span class="p">)</span> <span class="o">+</span> <span class="n">fgb</span><span class="o">.</span><span class="n">overlay</span><span class="p">(</span><span class="n">eof_action</span><span class="o">=</span><span class="s1">'repeat'</span><span class="p">)</span> <span class="o">+</span> <span class="n">fgb</span><span class="o">.</span><span class="n">drawbox</span><span class="p">(</span><span class="mi">50</span><span class="p">,</span> <span class="mi">50</span><span class="p">,</span> <span class="mi">120</span><span class="p">,</span> <span class="mi">120</span><span class="p">,</span> <span class="s1">'red'</span><span class="p">,</span> <span class="n">t</span><span class="o">=</span><span class="mi">5</span><span class="p">)</span>
<span class="gp">>>> </span><span class="n">v5</span>
<span class="go"><ffmpegio.filtergraph.Graph.Graph object at 0x2a4ef084bd0></span>
<span class="go"> FFmpeg expression: "[0]trim=start_frame=10:end_frame=20[L0];[0]trim=start_frame=30:end_frame=40[L1];[L0][L1]concat=2[L2];[1]hflip[L3];[L2][L3]overlay=eof_action=repeat,drawbox=50:50:120:120:red:t=5"</span>
<span class="go"> Number of chains: 5</span>
<span class="go"> chain[0]: [0]trim=start_frame=10:end_frame=20[L0];</span>
<span class="go"> chain[1]: [0]trim=start_frame=30:end_frame=40[L1];</span>
<span class="go"> chain[2]: [L0][L1]concat=2[L2];</span>
<span class="go"> chain[3]: [1]hflip[L3];</span>
<span class="go"> chain[4]: [L2][L3]overlay=eof_action=repeat,drawbox=50:50:120:120:red:t=5[UNC0]</span>
<span class="go"> Available input pads (0):</span>
<span class="go"> Available output pads: (1): (4, 1, 0)</span>
</pre></div>
</div>
</section>
<section id="device-i-o-enumeration">
<h3>Device I/O Enumeration<a class="headerlink" href="#device-i-o-enumeration" title="Link to this heading"></a></h3>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="c1"># record 5 minutes of audio from Windows microphone</span>
<span class="gp">>>> </span><span class="n">fs</span><span class="p">,</span> <span class="n">x</span> <span class="o">=</span> <span class="n">ffmpegio</span><span class="o">.</span><span class="n">audio</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="s1">'a:0'</span><span class="p">,</span> <span class="n">f_in</span><span class="o">=</span><span class="s1">'dshow'</span><span class="p">,</span> <span class="n">sample_fmt</span><span class="o">=</span><span class="s1">'dbl'</span><span class="p">,</span> <span class="n">t</span><span class="o">=</span><span class="mi">300</span><span class="p">)</span>
<span class="gp">>>> </span><span class="c1"># capture Windows' webcam frame</span>
<span class="gp">>>> </span><span class="k">with</span> <span class="n">ffmpegio</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s1">'v:0'</span><span class="p">,</span> <span class="s1">'rv'</span><span class="p">,</span> <span class="n">f_in</span><span class="o">=</span><span class="s1">'dshow'</span><span class="p">)</span> <span class="k">as</span> <span class="n">webcam</span><span class="p">,</span>
<span class="gp">>>> </span> <span class="k">for</span> <span class="n">frame</span> <span class="ow">in</span> <span class="n">webcam</span><span class="p">:</span>
<span class="gp">>>> </span> <span class="n">process_frame</span><span class="p">(</span><span class="n">frame</span><span class="p">)</span>
</pre></div>
</div>
</section>
<section id="progress-callback">
<h3>Progress Callback<a class="headerlink" href="#progress-callback" title="Link to this heading"></a></h3>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">pprint</span>
<span class="gp">>>> </span><span class="c1"># progress callback</span>
<span class="gp">>>> </span><span class="k">def</span> <span class="nf">progress</span><span class="p">(</span><span class="n">info</span><span class="p">,</span> <span class="n">done</span><span class="p">):</span>
<span class="gp">>>> </span> <span class="n">pprint</span><span class="p">(</span><span class="n">info</span><span class="p">)</span> <span class="c1"># bunch of stats</span>
<span class="gp">>>> </span> <span class="k">if</span> <span class="n">done</span><span class="p">:</span>
<span class="gp">>>> </span> <span class="nb">print</span><span class="p">(</span><span class="s1">'video decoding completed'</span><span class="p">)</span>
<span class="gp">>>> </span> <span class="k">else</span><span class="p">:</span>
<span class="gp">>>> </span> <span class="k">return</span> <span class="n">check_cancel_command</span><span class="p">():</span> <span class="c1"># return True to kill immediately</span>
<span class="gp">>>> </span><span class="c1"># can be used in any butch processing</span>
<span class="gp">>>> </span><span class="n">rate</span><span class="p">,</span> <span class="n">F</span> <span class="o">=</span> <span class="n">ffmpegio</span><span class="o">.</span><span class="n">video</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="s1">'myvideo.mp4'</span><span class="p">,</span> <span class="n">progress</span><span class="o">=</span><span class="n">progress</span><span class="p">)</span>
<span class="gp">>>> </span><span class="c1"># as well as for stream processing</span>
<span class="gp">>>> </span><span class="k">with</span> <span class="n">ffmpegio</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s1">'myvideo.mp4'</span><span class="p">,</span> <span class="s1">'rv'</span><span class="p">,</span> <span class="n">blocksize</span><span class="o">=</span><span class="mi">100</span><span class="p">,</span> <span class="n">progress</span><span class="o">=</span><span class="n">progress</span><span class="p">)</span> <span class="k">as</span> <span class="n">fin</span><span class="p">:</span>
<span class="gp">>>> </span> <span class="k">for</span> <span class="n">frames</span> <span class="ow">in</span> <span class="n">fin</span><span class="p">:</span>
<span class="gp">>>> </span> <span class="n">myprocess</span><span class="p">(</span><span class="n">frames</span><span class="p">)</span>
</pre></div>
</div>
</section>
<section id="run-ffmpeg-and-ffprobe-directly">
<h3>Run FFmpeg and FFprobe Directly<a class="headerlink" href="#run-ffmpeg-and-ffprobe-directly" title="Link to this heading"></a></h3>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">ffmpegio</span> <span class="kn">import</span> <span class="n">ffmpeg</span><span class="p">,</span> <span class="n">FFprobe</span><span class="p">,</span> <span class="n">ffmpegprocess</span>
<span class="gp">>>> </span><span class="kn">from</span> <span class="nn">subprocess</span> <span class="kn">import</span> <span class="n">PIPE</span>
<span class="gp">>>> </span><span class="c1"># call with options as a long string</span>
<span class="gp">>>> </span><span class="n">ffmpeg</span><span class="p">(</span><span class="s1">'-i input.avi -b:v 64k -bufsize 64k output.avi'</span><span class="p">)</span>
<span class="gp">>>> </span><span class="c1"># or call with list of options</span>
<span class="gp">>>> </span><span class="n">ffmpeg</span><span class="p">([</span><span class="s1">'-i'</span><span class="p">,</span> <span class="s1">'input.avi'</span> <span class="p">,</span><span class="s1">'-r'</span><span class="p">,</span> <span class="s1">'24'</span><span class="p">,</span> <span class="s1">'output.avi'</span><span class="p">])</span>
<span class="gp">>>> </span><span class="c1"># the same for ffprobe</span>
<span class="gp">>>> </span><span class="n">ffprobe</span><span class="p">(</span><span class="s1">'ffprobe -show_streams -select_streams a INPUT'</span><span class="p">)</span>
<span class="gp">>>> </span><span class="c1"># specify subprocess arguments to capture stdout</span>
<span class="gp">>>> </span><span class="n">out</span> <span class="o">=</span> <span class="n">ffprobe</span><span class="p">(</span><span class="s1">'ffprobe -of json -show_frames INPUT'</span><span class="p">,</span>
<span class="go"> stdout=PIPE, universal_newlines=True).stdout</span>
<span class="gp">>>> </span><span class="c1"># use ffmpegprocess to take advantage of ffmpegio's default behaviors</span>
<span class="gp">>>> </span><span class="n">out</span> <span class="o">=</span> <span class="n">ffmpegprocess</span><span class="o">.</span><span class="n">run</span><span class="p">({</span><span class="s2">"inputs"</span><span class="p">:</span> <span class="p">[(</span><span class="s2">"input.avi"</span><span class="p">,</span> <span class="kc">None</span><span class="p">)],</span>
<span class="go"> "outputs": [("out1.mp4", None),</span>
<span class="go"> ("-", {"f": "rawvideo", "vframes": 1, "pix_fmt": "gray", "an": None})</span>
<span class="go"> }, capture_log=True)</span>
<span class="gp">>>> </span><span class="nb">print</span><span class="p">(</span><span class="n">out</span><span class="o">.</span><span class="n">stderr</span><span class="p">)</span> <span class="c1"># print the captured FFmpeg logs (banner text omitted)</span>
<span class="gp">>>> </span><span class="n">b</span> <span class="o">=</span> <span class="n">out</span><span class="o">.</span><span class="n">stdout</span> <span class="c1"># width*height bytes of the first frame</span>
</pre></div>
</div>
</section>
</section>
</section>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>© Copyright 2021-2022, Takeshi (Kesh) Ikuma, Louisiana State University Health Sciences Center.</p>
</div>
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>