{"id":13617932,"url":"https://github.com/sunrise2575/dist-ffmpeg","last_synced_at":"2025-04-14T06:36:16.349Z","repository":{"id":37765841,"uuid":"475708178","full_name":"sunrise2575/dist-ffmpeg","owner":"sunrise2575","description":"Distributed \u0026 Parallel FFmpeg Transcoder","archived":false,"fork":false,"pushed_at":"2022-08-22T10:52:40.000Z","size":659,"stargazers_count":12,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-11-15T15:22:50.380Z","etag":null,"topics":["ffmpeg","korean","parallel-processing","python","transcoding","vp9"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sunrise2575.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-03-30T03:41:59.000Z","updated_at":"2024-08-23T15:52:49.000Z","dependencies_parsed_at":"2022-09-11T04:41:44.276Z","dependency_job_id":null,"html_url":"https://github.com/sunrise2575/dist-ffmpeg","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sunrise2575%2Fdist-ffmpeg","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sunrise2575%2Fdist-ffmpeg/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sunrise2575%2Fdist-ffmpeg/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sunrise2575%2Fdist-ffmpeg/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sunrise2575","download_url":"https://codeload.github.com/sunrise2575/dist-ffmpeg/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248836247,"owners_count":21169369,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ffmpeg","korean","parallel-processing","python","transcoding","vp9"],"created_at":"2024-08-01T20:01:50.872Z","updated_at":"2025-04-14T06:36:16.144Z","avatar_url":"https://github.com/sunrise2575.png","language":"Go","funding_links":[],"categories":["HarmonyOS"],"sub_categories":["Windows Manager"],"readme":"# dist-ffmpeg\n\n- Go, FFmpeg, ZeroMQ 를 사용해서 만든 고속 분산 병렬 transcoding system\n\n- 웹브라우저에서 재생되는 압축률 좋은 코덱 WebM VP9으로 변환시키는데에 특화되어 있습니다.\n\n- 이미지, 오디오, 비디오 3가지 종류의 파일을 transcoding 가능합니다.\n\n## Motivation\n\n- 웹에서 작동되는 비디오 코덱은 H264, VP8, VP9, AV1 정도가 있음\n\n- AV1과 VP9 코덱은 낮은 용량에 고화질임\n\n- AV1 코덱은 인코딩/디코딩이 쓸 수 없을정도로 오래 걸리며, 모바일용 하드웨어 디코더가 많이 퍼지지 않았음. 따라서 VP9이 합리적\n\n- VP9 코덱은 전용 하드웨어 인코더가 엄청나게 비쌈. CPU로 인코딩 필요\n\n- ffmpeg의 기본 인코더 (libvpx-vp9) 사용하면 최대 8개 hardware thread 만 활용\n\n- 파일을 divide-and-conquer 할 경우 비슷한 용량을 가지면서도 hardware thread 를 많이 사용하기 때문에 속도가 2~3배 빨라진다는 것을 발견 (성능에 관해서는 [리포트](./REPORT.md) 참고하세요.)\n\n- 이런 divide-and-conquer 방식 및 여러개의 computer를 이용해 분산 처리하여 transcoding에서 높은 throughput 달성\n\n## System Concept\n\n- Apache Spark와 비슷하게, 1개의 master, n개의 worker가 존재\n\n- Worker는 master와 접속되는 어떠한 computer에도 존재 가능\n\n- 1대의 computer에 여러개의 worker가 동작 가능\n\n- 서로 NFS 등으로 파일이 담겨있는 경로를 일치시켜야 함\n\n- Worker는 임시폴더를 활용해 처리 중 NFS traffic을 사용하지 않음\n\n- Worker는 받은 파일에 대해 `config.json` 을 참고하여 ffmpeg parameter를 결정하고 best-effort로 transcoding 수행\n\n- Master나 worker를 켜는 순서는 상관이 없고, master가 켜져 있으면 worker를 아무 때나 붙일 수 있음. Worker를 켜면 자동으로 작업을 받아 수행합니다\n\n- 파일이 transcode 전/후 코덱이 같으면 skip. 실패한 파일은 자동으로 넘어감\n\n## System Demo Image\n\n\u003cimg src=\"./img/demo.png\" height=\"700\"\u003e\n \n## Preparation\n\nUbuntu 18.04 기준입니다.\n\n1. NFS 설치\n    ```bash\n    sudo apt install nfs-kernel-server nfs-common -y\n    ```\n    master에는 `sudo vim /etc/exports/` 수정하여 NFS connection open하고 `sudo exportfs -r` 명령으로 적용\n\n2. Go 설치\n    ```bash\n    sudo add-apt-repository -y ppa:longsleep/golang-backports\n    sudo apt update -y\n    sudo apt install golang-go -y\n    ```\n\n3. FFmpeg 설치\n    ```bash\n    sudo add-apt-repository -y ppa:savoury1/ffmpeg4\n    sudo apt-get update -y\n    sudo apt-get install ffmpeg -y\n    ```\n\n4. ZeroMQ 설치\n    ```bash\n    sudo apt install libzmq3-dev -y\n    ```\n\n## Usage\n\n- Master side\n    ```bash\n    chmod 755 ./run_master.sh \u0026\u0026 ./run_master.sh \u003c디렉터리\u003e\n    ```\n\n- Worker side\n    ```bash\n    chmod 755 ./run_worker.sh \u0026\u0026 ./run_worker.sh \u003cmaster IP\u003e\n    ```\n\n## Copyright\n\nCopyright (c) 2022 All rights reserved by Heeyong Yoon\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsunrise2575%2Fdist-ffmpeg","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsunrise2575%2Fdist-ffmpeg","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsunrise2575%2Fdist-ffmpeg/lists"}