... | ... |
@@ -81,6 +81,14 @@ A number of hepler functions are also supplied: |
81 | 81 |
[`PIL.Image.resize`]: https://pillow.readthedocs.io/en/stable/reference/Image.html#PIL.Image.Image.resize |
82 | 82 |
[`cv2.putText`]: https://docs.opencv.org/master/d6/d6e/group__imgproc__draw.html#ga5126f47f883d730f633d74f07456c576 |
83 | 83 |
|
84 |
+### Examples |
|
85 |
+ |
|
86 |
+Projects using `pyffstream`: |
|
87 |
+ |
|
88 |
+- [`autozoom`][]: Automatically zoom in on video content of interest. |
|
89 |
+ |
|
90 |
+[`autozoom`]: https://git.rcrnstn.net/rcrnstn/autozoom |
|
91 |
+ |
|
84 | 92 |
## Installation |
85 | 93 |
|
86 | 94 |
### With `pip` |
... | ... |
@@ -2,6 +2,107 @@ |
2 | 2 |
|
3 | 3 |
A Python library to ease processing of video frames. |
4 | 4 |
|
5 |
+`pyffstream` is mostly a wrapper around external [FFmpeg][] processes (via |
|
6 |
+[`ffmpeg-python`][]) intended to be used with [OpenCV][]. |
|
7 |
+ |
|
8 |
+[FFmpeg]: https://ffmpeg.org |
|
9 |
+[`ffmpeg-python`]: https://github.com/kkroening/ffmpeg-python |
|
10 |
+[OpenCV]: https://opencv.org |
|
11 |
+ |
|
12 |
+## Usage |
|
13 |
+ |
|
14 |
+`pyffstream` provides your application with a command line interface (CLI) and |
|
15 |
+handles reading and writing video files (with the original audio intact), |
|
16 |
+filtering the frames through a callback that you define. The API consists |
|
17 |
+mainly of the single function |
|
18 |
+ |
|
19 |
+```python |
|
20 |
+run(description, process, init=None, args_pre=None, args_post=None) |
|
21 |
+``` |
|
22 |
+ |
|
23 |
+that takes the application description to present in the CLI and some |
|
24 |
+callbacks, all but one being optional: |
|
25 |
+ |
|
26 |
+- `process(args, state, frame, frame_num)`: |
|
27 |
+ |
|
28 |
+ Takes: |
|
29 |
+ |
|
30 |
+ - `args`: [`argparse.Namespace`][] containing parsed command line |
|
31 |
+ arguments. |
|
32 |
+ - `state`: arbitrary object returned by `init` (see below). |
|
33 |
+ - `frame`: [`numpy.array`][] with shape |
|
34 |
+ `(args.working_width, args.working_height, 3)` containing RGB data to |
|
35 |
+ be processed. |
|
36 |
+ - `frame_num`: integer in the range [`args.frame_start`, |
|
37 |
+ `args.frame_end`) representing the number of the current frame. |
|
38 |
+ |
|
39 |
+ Returns: |
|
40 |
+ |
|
41 |
+ - `output_frame`: [`numpy.array`][] with shape |
|
42 |
+ `(args.output_width, args.output_height, 3)` containing RGB output. |
|
43 |
+ - `debug_frame`: [`numpy.array`][] with shape |
|
44 |
+ `(args.working_width, args.working_height, 3)` containing RGB debug |
|
45 |
+ output. |
|
46 |
+ |
|
47 |
+- `init(args)`: |
|
48 |
+ |
|
49 |
+ Takes: |
|
50 |
+ |
|
51 |
+ - `args`: [`argparse.Namespace`][] containing parsed command line |
|
52 |
+ arguments. |
|
53 |
+ |
|
54 |
+ Returns: |
|
55 |
+ |
|
56 |
+ - `state`: arbitrary object passed to `process` (see above). |
|
57 |
+ |
|
58 |
+- `args_pre(parser)`, `args_post(parser)`: |
|
59 |
+ |
|
60 |
+ Takes: |
|
61 |
+ |
|
62 |
+ - `args`: [`argparse.ArgumentParser`][] before (for `args_pre`) or after |
|
63 |
+ (for `args_post`) being filled with `pyffstream` arguments. |
|
64 |
+ |
|
65 |
+ Returns nothing. |
|
66 |
+ |
|
67 |
+A number of hepler functions are also supplied: |
|
68 |
+ |
|
69 |
+- `resize(image, width, height, resample)`: wrapper around |
|
70 |
+ [`PIL.Image.resize`][]. |
|
71 |
+- `text(image, text, x, y, thickness, font=cv2.FONT_HERSHEY_SIMPLEX)`: |
|
72 |
+ wrapper around [`cv2.putText`][] that automatically adjusts text placement |
|
73 |
+ and scaling. |
|
74 |
+- `fix_rect(args, x, y, w, h)`: forces a rectangle to aspect ratio |
|
75 |
+ `args.output_aspect` and to be inside `(0, 0, args.working_width, |
|
76 |
+ args.working_height)`. |
|
77 |
+ |
|
78 |
+[`argparse.Namespace`]: https://docs.python.org/3/library/argparse.html#argparse.Namespace |
|
79 |
+[`argparse.ArgumentParser`]: https://docs.python.org/3/library/argparse.html#argparse.ArgumentParser |
|
80 |
+[`numpy.array`]: https://numpy.org/doc/stable/reference/generated/numpy.array.html |
|
81 |
+[`PIL.Image.resize`]: https://pillow.readthedocs.io/en/stable/reference/Image.html#PIL.Image.Image.resize |
|
82 |
+[`cv2.putText`]: https://docs.opencv.org/master/d6/d6e/group__imgproc__draw.html#ga5126f47f883d730f633d74f07456c576 |
|
83 |
+ |
|
84 |
+## Installation |
|
85 |
+ |
|
86 |
+### With `pip` |
|
87 |
+ |
|
88 |
+```sh |
|
89 |
+python3 -m pip install git+https://git.rcrnstn.net/rcrnstn/pyffstream |
|
90 |
+``` |
|
91 |
+ |
|
92 |
+### In `setuptools` `setup.py` |
|
93 |
+ |
|
94 |
+```python |
|
95 |
+from setuptools import setup |
|
96 |
+ |
|
97 |
+setup( |
|
98 |
+ # ... |
|
99 |
+ install_requires=[ |
|
100 |
+ 'pyffstream @ git+https://git.rcrnstn.net/rcrnstn/pyffstream', |
|
101 |
+ ], |
|
102 |
+ # ... |
|
103 |
+) |
|
104 |
+``` |
|
105 |
+ |
|
5 | 106 |
## License |
6 | 107 |
|
7 | 108 |
Licensed under the [ISC license][], see the [`LICENSE`](LICENSE) file. |