## image-utils
When I am dealing pics,mp3,mp4. I always want a media utils to help me work, that's why this project start
### mp4处理
* 转png/jpg等
* 转mp3
* 转gif
* 转竖屏
* 其他格式视频转mp4
### mp3处理
* 转文字
* 转srt
* mp3裁剪
* mp3其他格式,eg:flac,WAV,AAC,Ogg,等互相转换
### 图片png/jpg处理
* 添加文字
* 图片文字识别
* 图片按比例放缩/图片旋转
* 图片转灰白
* 图片按比例剪切
* 图片格式相互转换
### install
```
pip install easy-media-utils
```
<details>
<summary>源码安装(点击展开) </summary>
# pip freeze > requirements.txt
git clone https://github.com/aceliuchanghong/easy-media-utils.git
conda create -n dealMedia python=3.11
conda activate dealMedia
pip install -r requirements.txt
</details>
### ffmpeg
前往官网,下载对应版本的文件,解压放在本地文件并且配置环境变量,确保可以访问到
```
ffmpeg -version
```
### 项目结构
<details>
<summary>项目结构生成(点击展开) </summary>
from tree_utils.struct_tree_out import print_tree
path = r'D:\aprojectPython\pythonProject\easy-media-utils'
print_tree(path)
</details>
```
easy-media-utils/
|
├── LICENSE
├── README.md
├── requirements.txt
├── setup.py
├── base_model/
│ ├── MediaHandler.py
│ └── __init__.py
├── image_utils/
│ ├── __init__.py
│ ├── gpt_prompt.md
│ ├── converters/
│ │ ├── __init__.py
│ │ ├── format_converter.py
│ │ ├── image_to_text.py
│ │ └── text_add_to_image.py
│ ├── core/
│ │ ├── __init__.py
│ │ ├── exceptions.py
│ │ └── image_handler.py
│ ├── editors/
│ │ ├── __init__.py
│ │ ├── cropper.py
│ │ └── resizer.py
│ ├── tests/
│ │ ├── __init__.py
│ │ ├── test_converters.py
│ │ ├── test_editors.py
│ │ └── test_utils.py
│ └── utils/
│ ├── __init__.py
│ └── image_utils.py
├── mp3_utils/
│ ├── __init__.py
│ ├── gpt_prompt.md
│ ├── converters/
│ │ ├── __init__.py
│ │ ├── audio_format_converter.py
│ │ └── mp3_to_text.py
│ ├── core/
│ │ ├── __init__.py
│ │ ├── exceptions.py
│ │ └── mp3_handler.py
│ ├── editors/
│ │ ├── __init__.py
│ │ ├── effects.py
│ │ └── trimmer.py
│ ├── tests/
│ │ ├── __init__.py
│ │ ├── test_converters.py
│ │ └── test_editors.py
│ └── utils/
│ ├── __init__.py
│ └── mp3_utils.py
├── mp4_utils/
│ ├── __init__.py
│ ├── gpt_prompt.md
│ ├── converters/
│ │ ├── __init__.py
│ │ ├── mp4_to_gif.py
│ │ ├── mp4_to_mp3.py
│ │ ├── mp4_to_pngs.py
│ │ └── tv_to_mp4.py
│ ├── core/
│ │ ├── __init__.py
│ │ ├── exceptions.py
│ │ └── mp4_handler.py
│ ├── editors/
│ │ ├── __init__.py
│ │ ├── orientation.py
│ │ └── resizer.py
│ ├── tests/
│ │ ├── __init__.py
│ │ ├── test_converters.py
│ │ └── test_editors.py
│ └── utils/
│ ├── __init__.py
│ ├── file_utils.py
│ └── mp4_utils.py
├── testfiles/
└── tree_utils/
├── __init__.py
└── struct_tree_out.py
```
### e.g.
```mp4
from mp4_utils.converters.mp4_to_gif import MP4ToGIFConverter
from mp4_utils.converters.mp4_to_mp3 import MP4ToMP3Converter
from mp4_utils.converters.mp4_to_pngs import MP4ToPNGsConverter
from mp4_utils.converters.tv_to_mp4 import TVToMP4Converter
from mp4_utils.core.mp4_handler import MP4Handler
def main(converter_type, file_path='../../testfiles/onboard_cover.mp4') -> MP4Handler:
"""
Convert MP4 each frame.
:param converter_type:
:param file_path:
"""
Converter = {
"gif": MP4ToGIFConverter,
"mp3": MP4ToMP3Converter,
"img": MP4ToPNGsConverter,
"other": TVToMP4Converter,
}
# converter = Converter[converter_type](file_path)
converter = Converter.get(converter_type)(file_path)
return converter
if __name__ == "__main__":
file_path = '../../testfiles/out/onboard_cover.mp4'
gif_out_path = '../../testfiles/out/output.gif'
mp3_out_path = '../../testfiles/out/output.mp3'
pngs_out_path = '../../testfiles/out/pngs_output'
mp4_out_path = '../../testfiles/out/Sample.mp4'
conv_file = '../../testfiles/out/Sample.mkv'
converter_type = "img"
ans_path = pngs_out_path
converter = main(converter_type, file_path)
converter.process(ans_path)
```
```mp3
from mp3_utils.converters.audio_format_converter import AudioFormatConverter
from mp3_utils.core.mp3_handler import MP3Handler
def main(converter_type, file_path='../../testfiles/out/output.mp3') -> MP3Handler:
"""
Convert MP4 each frame.
:param converter_type:
:param file_path:
"""
Converter = {
"format": AudioFormatConverter,
}
converter = Converter.get(converter_type)(file_path)
return converter
if __name__ == "__main__":
mp3_path = '../../testfiles/out/output.mp3'
wav_path = '../../testfiles/out/output.wav'
flac_path = '../../testfiles/out/output.flac'
converter_type = "format"
ans_path = flac_path
converter = main(converter_type, wav_path)
converter.process(ans_path, 'flac')
```
```img
from image_utils.converters.format_converter import FormatConverter
test_image_path = "../../testfiles/out/pngs_output/frame_0001.png"
output_path = "../../testfiles/out/imgs_output"
txt = "你好"
if __name__ == '__main__':
converter = FormatConverter(test_image_path)
converter.process(output_path, "png")
```
Raw data
{
"_id": null,
"home_page": "https://github.com/aceliuchanghong/easy-media-utils.git",
"name": "easy-media-utils",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.6",
"maintainer_email": "",
"keywords": "media handling image audio video conversion editing",
"author": "Sisconsavior",
"author_email": "aceliuchanghong@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/70/5c/e9539ef40bdaeb7ab742e68dbdf25e22abcea252dc503f2e59c597b8d4a4/easy-media-utils-0.1.5.tar.gz",
"platform": null,
"description": "## image-utils\r\n\r\nWhen I am dealing pics,mp3,mp4. I always want a media utils to help me work, that's why this project start\r\n\r\n### mp4\u5904\u7406\r\n\r\n* \u8f6cpng/jpg\u7b49\r\n* \u8f6cmp3\r\n* \u8f6cgif\r\n* \u8f6c\u7ad6\u5c4f\r\n* \u5176\u4ed6\u683c\u5f0f\u89c6\u9891\u8f6cmp4\r\n\r\n### mp3\u5904\u7406\r\n\r\n* \u8f6c\u6587\u5b57\r\n* \u8f6csrt\r\n* mp3\u88c1\u526a\r\n* mp3\u5176\u4ed6\u683c\u5f0f,eg:flac,WAV,AAC,Ogg,\u7b49\u4e92\u76f8\u8f6c\u6362\r\n\r\n### \u56fe\u7247png/jpg\u5904\u7406\r\n\r\n* \u6dfb\u52a0\u6587\u5b57\r\n* \u56fe\u7247\u6587\u5b57\u8bc6\u522b\r\n* \u56fe\u7247\u6309\u6bd4\u4f8b\u653e\u7f29/\u56fe\u7247\u65cb\u8f6c\r\n* \u56fe\u7247\u8f6c\u7070\u767d\r\n* \u56fe\u7247\u6309\u6bd4\u4f8b\u526a\u5207\r\n* \u56fe\u7247\u683c\u5f0f\u76f8\u4e92\u8f6c\u6362\r\n\r\n### install\r\n\r\n```\r\npip install easy-media-utils\r\n```\r\n\r\n<details>\r\n<summary>\u6e90\u7801\u5b89\u88c5(\u70b9\u51fb\u5c55\u5f00) </summary>\r\n# pip freeze > requirements.txt\r\n\r\ngit clone https://github.com/aceliuchanghong/easy-media-utils.git\r\n\r\nconda create -n dealMedia python=3.11\r\n\r\nconda activate dealMedia\r\n\r\npip install -r requirements.txt\r\n</details>\r\n\r\n### ffmpeg\r\n\r\n\u524d\u5f80\u5b98\u7f51,\u4e0b\u8f7d\u5bf9\u5e94\u7248\u672c\u7684\u6587\u4ef6,\u89e3\u538b\u653e\u5728\u672c\u5730\u6587\u4ef6\u5e76\u4e14\u914d\u7f6e\u73af\u5883\u53d8\u91cf,\u786e\u4fdd\u53ef\u4ee5\u8bbf\u95ee\u5230\r\n\r\n```\r\nffmpeg -version\r\n```\r\n\r\n### \u9879\u76ee\u7ed3\u6784\r\n\r\n<details>\r\n<summary>\u9879\u76ee\u7ed3\u6784\u751f\u6210(\u70b9\u51fb\u5c55\u5f00) </summary>\r\nfrom tree_utils.struct_tree_out import print_tree\r\n\r\npath = r'D:\\aprojectPython\\pythonProject\\easy-media-utils'\r\n\r\nprint_tree(path)\r\n</details>\r\n\r\n```\r\neasy-media-utils/\r\n|\r\n\u251c\u2500\u2500 LICENSE\r\n\u251c\u2500\u2500 README.md\r\n\u251c\u2500\u2500 requirements.txt\r\n\u251c\u2500\u2500 setup.py\r\n\u251c\u2500\u2500 base_model/\r\n\u2502 \u251c\u2500\u2500 MediaHandler.py\r\n\u2502 \u2514\u2500\u2500 __init__.py\r\n\u251c\u2500\u2500 image_utils/\r\n\u2502 \u251c\u2500\u2500 __init__.py\r\n\u2502 \u251c\u2500\u2500 gpt_prompt.md\r\n\u2502 \u251c\u2500\u2500 converters/\r\n\u2502 \u2502 \u251c\u2500\u2500 __init__.py\r\n\u2502 \u2502 \u251c\u2500\u2500 format_converter.py\r\n\u2502 \u2502 \u251c\u2500\u2500 image_to_text.py\r\n\u2502 \u2502 \u2514\u2500\u2500 text_add_to_image.py\r\n\u2502 \u251c\u2500\u2500 core/\r\n\u2502 \u2502 \u251c\u2500\u2500 __init__.py\r\n\u2502 \u2502 \u251c\u2500\u2500 exceptions.py\r\n\u2502 \u2502 \u2514\u2500\u2500 image_handler.py\r\n\u2502 \u251c\u2500\u2500 editors/\r\n\u2502 \u2502 \u251c\u2500\u2500 __init__.py\r\n\u2502 \u2502 \u251c\u2500\u2500 cropper.py\r\n\u2502 \u2502 \u2514\u2500\u2500 resizer.py\r\n\u2502 \u251c\u2500\u2500 tests/\r\n\u2502 \u2502 \u251c\u2500\u2500 __init__.py\r\n\u2502 \u2502 \u251c\u2500\u2500 test_converters.py\r\n\u2502 \u2502 \u251c\u2500\u2500 test_editors.py\r\n\u2502 \u2502 \u2514\u2500\u2500 test_utils.py\r\n\u2502 \u2514\u2500\u2500 utils/\r\n\u2502 \u251c\u2500\u2500 __init__.py\r\n\u2502 \u2514\u2500\u2500 image_utils.py\r\n\u251c\u2500\u2500 mp3_utils/\r\n\u2502 \u251c\u2500\u2500 __init__.py\r\n\u2502 \u251c\u2500\u2500 gpt_prompt.md\r\n\u2502 \u251c\u2500\u2500 converters/\r\n\u2502 \u2502 \u251c\u2500\u2500 __init__.py\r\n\u2502 \u2502 \u251c\u2500\u2500 audio_format_converter.py\r\n\u2502 \u2502 \u2514\u2500\u2500 mp3_to_text.py\r\n\u2502 \u251c\u2500\u2500 core/\r\n\u2502 \u2502 \u251c\u2500\u2500 __init__.py\r\n\u2502 \u2502 \u251c\u2500\u2500 exceptions.py\r\n\u2502 \u2502 \u2514\u2500\u2500 mp3_handler.py\r\n\u2502 \u251c\u2500\u2500 editors/\r\n\u2502 \u2502 \u251c\u2500\u2500 __init__.py\r\n\u2502 \u2502 \u251c\u2500\u2500 effects.py\r\n\u2502 \u2502 \u2514\u2500\u2500 trimmer.py\r\n\u2502 \u251c\u2500\u2500 tests/\r\n\u2502 \u2502 \u251c\u2500\u2500 __init__.py\r\n\u2502 \u2502 \u251c\u2500\u2500 test_converters.py\r\n\u2502 \u2502 \u2514\u2500\u2500 test_editors.py\r\n\u2502 \u2514\u2500\u2500 utils/\r\n\u2502 \u251c\u2500\u2500 __init__.py\r\n\u2502 \u2514\u2500\u2500 mp3_utils.py\r\n\u251c\u2500\u2500 mp4_utils/\r\n\u2502 \u251c\u2500\u2500 __init__.py\r\n\u2502 \u251c\u2500\u2500 gpt_prompt.md\r\n\u2502 \u251c\u2500\u2500 converters/\r\n\u2502 \u2502 \u251c\u2500\u2500 __init__.py\r\n\u2502 \u2502 \u251c\u2500\u2500 mp4_to_gif.py\r\n\u2502 \u2502 \u251c\u2500\u2500 mp4_to_mp3.py\r\n\u2502 \u2502 \u251c\u2500\u2500 mp4_to_pngs.py\r\n\u2502 \u2502 \u2514\u2500\u2500 tv_to_mp4.py\r\n\u2502 \u251c\u2500\u2500 core/\r\n\u2502 \u2502 \u251c\u2500\u2500 __init__.py\r\n\u2502 \u2502 \u251c\u2500\u2500 exceptions.py\r\n\u2502 \u2502 \u2514\u2500\u2500 mp4_handler.py\r\n\u2502 \u251c\u2500\u2500 editors/\r\n\u2502 \u2502 \u251c\u2500\u2500 __init__.py\r\n\u2502 \u2502 \u251c\u2500\u2500 orientation.py\r\n\u2502 \u2502 \u2514\u2500\u2500 resizer.py\r\n\u2502 \u251c\u2500\u2500 tests/\r\n\u2502 \u2502 \u251c\u2500\u2500 __init__.py\r\n\u2502 \u2502 \u251c\u2500\u2500 test_converters.py\r\n\u2502 \u2502 \u2514\u2500\u2500 test_editors.py\r\n\u2502 \u2514\u2500\u2500 utils/\r\n\u2502 \u251c\u2500\u2500 __init__.py\r\n\u2502 \u251c\u2500\u2500 file_utils.py\r\n\u2502 \u2514\u2500\u2500 mp4_utils.py\r\n\u251c\u2500\u2500 testfiles/\r\n\u2514\u2500\u2500 tree_utils/\r\n \u251c\u2500\u2500 __init__.py\r\n \u2514\u2500\u2500 struct_tree_out.py\r\n```\r\n\r\n### e.g.\r\n\r\n```mp4\r\nfrom mp4_utils.converters.mp4_to_gif import MP4ToGIFConverter\r\nfrom mp4_utils.converters.mp4_to_mp3 import MP4ToMP3Converter\r\nfrom mp4_utils.converters.mp4_to_pngs import MP4ToPNGsConverter\r\nfrom mp4_utils.converters.tv_to_mp4 import TVToMP4Converter\r\nfrom mp4_utils.core.mp4_handler import MP4Handler\r\n\r\ndef main(converter_type, file_path='../../testfiles/onboard_cover.mp4') -> MP4Handler:\r\n \"\"\"\r\n Convert MP4 each frame.\r\n :param converter_type:\r\n :param file_path:\r\n \"\"\"\r\n Converter = {\r\n \"gif\": MP4ToGIFConverter,\r\n \"mp3\": MP4ToMP3Converter,\r\n \"img\": MP4ToPNGsConverter,\r\n \"other\": TVToMP4Converter,\r\n }\r\n # converter = Converter[converter_type](file_path)\r\n converter = Converter.get(converter_type)(file_path)\r\n return converter\r\n\r\nif __name__ == \"__main__\":\r\n file_path = '../../testfiles/out/onboard_cover.mp4'\r\n gif_out_path = '../../testfiles/out/output.gif'\r\n mp3_out_path = '../../testfiles/out/output.mp3'\r\n pngs_out_path = '../../testfiles/out/pngs_output'\r\n mp4_out_path = '../../testfiles/out/Sample.mp4'\r\n\r\n conv_file = '../../testfiles/out/Sample.mkv'\r\n\r\n converter_type = \"img\"\r\n ans_path = pngs_out_path\r\n converter = main(converter_type, file_path)\r\n converter.process(ans_path)\r\n```\r\n\r\n```mp3\r\nfrom mp3_utils.converters.audio_format_converter import AudioFormatConverter\r\nfrom mp3_utils.core.mp3_handler import MP3Handler\r\n\r\ndef main(converter_type, file_path='../../testfiles/out/output.mp3') -> MP3Handler:\r\n \"\"\"\r\n Convert MP4 each frame.\r\n :param converter_type:\r\n :param file_path:\r\n \"\"\"\r\n Converter = {\r\n \"format\": AudioFormatConverter,\r\n }\r\n converter = Converter.get(converter_type)(file_path)\r\n return converter\r\n\r\nif __name__ == \"__main__\":\r\n mp3_path = '../../testfiles/out/output.mp3'\r\n wav_path = '../../testfiles/out/output.wav'\r\n flac_path = '../../testfiles/out/output.flac'\r\n\r\n converter_type = \"format\"\r\n ans_path = flac_path\r\n\r\n converter = main(converter_type, wav_path)\r\n converter.process(ans_path, 'flac')\r\n```\r\n\r\n```img\r\nfrom image_utils.converters.format_converter import FormatConverter\r\n\r\ntest_image_path = \"../../testfiles/out/pngs_output/frame_0001.png\"\r\noutput_path = \"../../testfiles/out/imgs_output\"\r\ntxt = \"\u4f60\u597d\"\r\n\r\nif __name__ == '__main__':\r\n converter = FormatConverter(test_image_path)\r\n converter.process(output_path, \"png\")\r\n\r\n```\r\n",
"bugtrack_url": null,
"license": "LICENSE",
"summary": "A collection of Python utilities for handling media files.",
"version": "0.1.5",
"project_urls": {
"Homepage": "https://github.com/aceliuchanghong/easy-media-utils.git"
},
"split_keywords": [
"media",
"handling",
"image",
"audio",
"video",
"conversion",
"editing"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "de4b8f216ce00412274d1a03f987227e962fd89d43ec276b5696d82c47225674",
"md5": "3d1d33c5ce76283c76b0d66cac99487e",
"sha256": "32ed795c1696af6757d36e37206c3be7f3a8e2ec93c68cf7dc7795e9b9b211cf"
},
"downloads": -1,
"filename": "easy_media_utils-0.1.5-py3-none-any.whl",
"has_sig": false,
"md5_digest": "3d1d33c5ce76283c76b0d66cac99487e",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.6",
"size": 47229,
"upload_time": "2024-01-08T06:37:28",
"upload_time_iso_8601": "2024-01-08T06:37:28.487109Z",
"url": "https://files.pythonhosted.org/packages/de/4b/8f216ce00412274d1a03f987227e962fd89d43ec276b5696d82c47225674/easy_media_utils-0.1.5-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "705ce9539ef40bdaeb7ab742e68dbdf25e22abcea252dc503f2e59c597b8d4a4",
"md5": "5d050939da983892980503f22549d125",
"sha256": "79aff499620ea24ceb2c303684592c53fc6c4df77d993b745c24c04287d2d0e8"
},
"downloads": -1,
"filename": "easy-media-utils-0.1.5.tar.gz",
"has_sig": false,
"md5_digest": "5d050939da983892980503f22549d125",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.6",
"size": 34824,
"upload_time": "2024-01-08T06:37:30",
"upload_time_iso_8601": "2024-01-08T06:37:30.514818Z",
"url": "https://files.pythonhosted.org/packages/70/5c/e9539ef40bdaeb7ab742e68dbdf25e22abcea252dc503f2e59c597b8d4a4/easy-media-utils-0.1.5.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-01-08 06:37:30",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "aceliuchanghong",
"github_project": "easy-media-utils",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"requirements": [],
"lcname": "easy-media-utils"
}