@@ -66,19 +66,18 @@ To import `ffmpegio`
6666
6767 >> > import ffmpegio
6868
69- - `Transcoding <ex_trancode >`__
70- - `Read Audio Files <ex_read_audio >`__
71- - `Read Image Files / Capture Video Frames <ex_read_image >`__
72- - `Read Video Files <ex_read_video >`__
73- - `Read Multiple Files or Streams <ex_read_media >`__
74- - `Write Audio, Image, & Video Files <ex_write >`__
75- - `Filter Audio, Image, & Video Data <ex_filter >`__
76- - `Stream I/O <ex_stream >`__
77- - `Device I/O Enumeration <ex_devices >`__
78- - `Progress Callback <ex_progress >`__
79- - `Run FFmpeg and FFprobe Directly <ex_direct >`__
80-
81- .. _ex_trancode :
69+ - `Transcoding <transcoding _>`_
70+ - `Read Audio Files <Read Audio Files _>`_
71+ - `Read Image Files / Capture Video Frames <Read Image Files / Capture Video Frames _>`_
72+ - `Read Video Files <Read Video Files _>`_
73+ - `Read Multiple Files or Streams <Read Multiple Files or Streams _>`_
74+ - `Write Audio, Image, & Video Files <Write Audio, Image, & Video Files _>`_
75+ - `Filter Audio, Image, & Video Data <Filter Audio, Image, & Video Data _>`_
76+ - `Stream I/O <Stream I/O _>`_
77+ - `Device I/O Enumeration <Device I/O Enumeration _>`_
78+ - `Progress Callback <Progress Callback _>`_
79+ - `Filtergraph Builder `_
80+ - `Run FFmpeg and FFprobe Directly <Run FFmpeg and FFprobe Directly _>`_
8281
8382Transcoding
8483^^^^^^^^^^^
@@ -103,8 +102,6 @@ Transcoding
103102 >> > with ffconcat: # generates temporary ffconcat file
104103 >> > ffmpegio.transcode(ffconcat, ' output.mkv' , f_in = ' concat' , codec = ' copy' , safe_in = 0 )
105104
106- .. _ex_read_audio :
107-
108105 Read Audio Files
109106^^^^^^^^^^^^^^^^
110107
@@ -121,8 +118,6 @@ Read Audio Files
121118 >> > # filter: equalizer which attenuate 10 dB at 1 kHz with a bandwidth of 200 Hz
122119 >> > fs, x = ffmpegio.audio.read(' myaudio.mp3' , t = 10.0 , af = ' equalizer=f=1000:t=h:width=200:g=-10' )
123120
124- .. _ex_read_image :
125-
126121 Read Image Files / Capture Video Frames
127122^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
128123
@@ -153,8 +148,6 @@ Read Image Files / Capture Video Frames
153148 >> > I = ffmpegio.image.read(' myaudio.mp3' , filter_complex = ' showspectrumpic=s=960x540' , pix_fmt = ' rgb24' )
154149
155150
156- .. _ex_read_video :
157-
158151 Read Video Files
159152^^^^^^^^^^^^^^^^
160153
@@ -168,8 +161,6 @@ Read Video Files
168161 >> > fs, F = ffmpegio.video.read(' myvideo.mp4' , pix_fmt = ' rgb24' , filter_complex = ' showspectrum=s=1280x480' )
169162
170163
171- .. _ex_read_media :
172-
173164 Read Multiple Files or Streams
174165^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
175166
@@ -189,8 +180,6 @@ Read Multiple Files or Streams
189180 >> > # rates: dict of frame rates: keys="v:0" and "v:1"
190181 >> > # data: dict of video frame arrays: keys="v:0" and "v:1"
191182
192- .. _ex_write :
193-
194183 Write Audio, Image, & Video Files
195184^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
196185
@@ -205,8 +194,6 @@ Write Audio, Image, & Video Files
205194 >> > # create an audio file from a numpy array
206195 >> > ffmpegio.audio.write(' myaudio.mp3' , rate, x)
207196
208- .. _ex_filter :
209-
210197 Filter Audio, Image, & Video Data
211198^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
212199
@@ -222,8 +209,6 @@ Filter Audio, Image, & Video Data
222209 >> > filter = " drawtext=fontsize=30:fontfile=FreeSerif.ttf:text='hello world':x=(w-text_w)/2:y=(h-text_h)/2"
223210 >> > fs_out, F_out = ffmpegio.video.filter(filter , fs_in, F_in)
224211
225- .. _ex_stream :
226-
227212 Stream I/O
228213^^^^^^^^^^
229214
@@ -236,7 +221,30 @@ Stream I/O
236221 >> > for frames in fin:
237222 >> > fout.write(myprocess(frames))
238223
239- .. _ex_devices :
224+ Filtergraph Builder
225+ ^^^^^^^^^^^^^^^^^^^
226+
227+ .. code-block :: python
228+
229+ >> > # build complex filtergraph
230+ >> > from ffmpegio import filtergraph as fgb
231+ >> >
232+ >> > v0 = " [0]" >> fgb.trim(start_frame = 10 , end_frame = 20 )
233+ >> > v1 = " [0]" >> fgb.trim(start_frame = 30 , end_frame = 40 )
234+ >> > v3 = " [1]" >> fgb.hflip()
235+ >> > v2 = (v0 | v1) + fgb.concat(2 )
236+ >> > v5 = (v2| v3) + fgb.overlay(eof_action = ' repeat' ) + fgb.drawbox(50 , 50 , 120 , 120 , ' red' , t = 5 )
237+ >> > v5
238+ < ffmpegio.filtergraph.Graph object at 0x 1e67f955b80>
239+ 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"
240+ Number of chains: 5
241+ chain[0 ]: [0 ]trim= start_frame= 10 :end_frame= 20 [L0];
242+ chain[1 ]: [0 ]trim= start_frame= 30 :end_frame= 40 [L1];
243+ chain[2 ]: [L0][L1]concat= 2 [L2];
244+ chain[3 ]: [1 ]hflip[L3];
245+ chain[4 ]: [L2][L3]overlay= eof_action= repeat,drawbox= 50 :50 :120 :120 :red:t= 5
246+ Available input pads (0 ):
247+ Available output pads: (1 ): (4 , 1 , 0 )
240248
241249 Device I/O Enumeration
242250^^^^^^^^^^^^^^^^^^^^^^
@@ -251,8 +259,6 @@ Device I/O Enumeration
251259 >> > for frame in webcam:
252260 >> > process_frame(frame)
253261
254- .. _ex_progress :
255-
256262 Progress Callback
257263^^^^^^^^^^^^^^^^^
258264
@@ -276,8 +282,6 @@ Progress Callback
276282 >> > for frames in fin:
277283 >> > myprocess(frames)
278284
279- .. _ex_direct :
280-
281285 Run FFmpeg and FFprobe Directly
282286^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
283287
0 commit comments