{"id":18598022,"url":"https://github.com/mingslife/rtmp-recorder","last_synced_at":"2025-05-05T20:50:52.053Z","repository":{"id":230658137,"uuid":"290168238","full_name":"mingslife/rtmp-recorder","owner":"mingslife","description":"📹 RTMP Live Video Recorder","archived":false,"fork":false,"pushed_at":"2020-08-25T12:16:00.000Z","size":15,"stargazers_count":5,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-30T23:31:39.602Z","etag":null,"topics":["docker","docker-compose","flv","golang","rtmp"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mingslife.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2020-08-25T09:10:16.000Z","updated_at":"2024-05-09T12:09:43.000Z","dependencies_parsed_at":"2024-03-31T06:37:25.515Z","dependency_job_id":null,"html_url":"https://github.com/mingslife/rtmp-recorder","commit_stats":null,"previous_names":["mingslife/rtmp-recorder"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mingslife%2Frtmp-recorder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mingslife%2Frtmp-recorder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mingslife%2Frtmp-recorder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mingslife%2Frtmp-recorder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mingslife","download_url":"https://codeload.github.com/mingslife/rtmp-recorder/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252575961,"owners_count":21770662,"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":["docker","docker-compose","flv","golang","rtmp"],"created_at":"2024-11-07T01:30:13.597Z","updated_at":"2025-05-05T20:50:52.033Z","avatar_url":"https://github.com/mingslife.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# rtmp-recorder\n\nRTMP Live Video Recorder\n\n[![Go Report Card](https://goreportcard.com/badge/github.com/mingslife/rtmp-recorder)](https://goreportcard.com/report/mingslife/rtmp-recorder)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n## 简介\n\n\u003e 时间就像海绵里的水，挤一挤总是有的。——鲁迅\n\n这是一个 RTMP 直播流录制的服务程序。做这个东西的目的在于有时候想看某场直播，但是直播时间跟自己的日程冲突了，或者说有些直播可能是在深夜时分，而作为一只社畜，考虑到第二天还要上班，是不太可能跟着一直嗨到通宵达旦的，而且大部分的直播都是没有重播的，所以做了一个录播的服务，可以在我们时间跟直播时间冲突的时间，先把直播录制下来，等我们空了再去看，岂不美哉？\n\n目前该项目仅支持 RTMP 直播流的录制，未来可能还会支持其他协议的直播流录制，本质只是改变 worker 实现而已，有兴趣的同学也可以帮忙实现了给我发 PR。这里的 worker 类似于 Drone CI 的 Runner 实现（或者说这一块根本就是一模一样）。这个项目只是临时用了一天不到的时间写的，后边如果有机会加上别的协议支持的话，我会考虑换下项目名字的。\n\n## 原理\n\n该项目主要是基于 [RTMPDump](http://git.ffmpeg.org/rtmpdump) 和 [FLVMeta](https://github.com/noirotm/flvmeta) 去实现，然后用 [Gin](https://github.com/gin-gonic/gin) 包装了下调度控制的 Web 服务程序。我们先是通过 rtmpdump 把 RTMP 直播流存为 flv 格式的视频，为修正 rtmpdump 录制的过程中可能出错退出导致 flv 元信息出错（最主要的表现就是播放 flv 视频时无进度条），在结束录制之后，我们再用 flvmeta 去进行视频元信息检查和修正。\n\n## 安装\n\n我这里用的是 Docker Compose 进行部署的，所以没什么好说的，docker-compose 一键安装即可。\n\n```bash\ndocker-compose build \u0026\u0026 docker-compose up -d\n```\n\n## 启动参数\n\n* --port 服务端口（默认：5000）\n* --token 令牌（默认：12345678）\n\n## API\n\n如果启动参数 token 不为空的话，那么在访问以下所有 API 的时候，都必须在请求 URL 的 query 部分加上 token 参数，如 ``/api/videos?token=12345678``。\n\n### 获取视频录制任务列表\n\n#### Request\n\n- Method: **GET**\n- URL: ``/api/videos``\n\n#### Response\n\n- Body:\n```json\n{\n  \"rows\": [\n    {\n      \"id\": \"BEEJyW6MenrxUCnsYNqPLH\",\n      \"status\": \"Up\",\n      \"duration\": \"6 minutes ago\",\n      \"name\": \"\",\n      \"url\": \"\"\n    }\n  ],\n  \"total\": 1\n}\n```\n\n### 获取视频录制任务详情\n\n#### Request\n\n- Method: **GET**\n- URL: ``/api/videos/:id``\n\n#### Response\n\n- Body:\n```json\n{\n  \"id\": \"BEEJyW6MenrxUCnsYNqPLH\",\n  \"status\": \"\",\n  \"duration\": \"\",\n  \"name\": \"zzz.flv\",\n  \"url\": \"rtmp://xxx/yyy/zzz\"\n}\n```\n\n### 创建视频录制任务\n\n#### Request\n\n- Method: **POST**\n- URL: ``/api/videos``\n- Headers: ``Content-Type: application/json;application=UTF-8``\n- Body:\n```json\n{\n  \"name\": \"zzz.flv\",\n  \"url\": \"rtmp://xxx/yyy/zzz\"\n}\n```\n\n#### Response\n\n- Body:\n```json\n{\n  \"id\": \"\",\n  \"status\": \"\",\n  \"duration\": \"\",\n  \"name\": \"zzz.flv\",\n  \"url\": \"rtmp://xxx/yyy/zzz\"\n}\n```\n\n### 删除视频录制任务\n\n#### Request\n\n- Method: **DELETE**\n- URL: ``/api/videos/:id``\n\n#### Response\n\n## 相关项目\n\n* [RTMPDump](http://rtmpdump.mplayerhq.hu/)\n* [FLVMeta](https://flvmeta.com/)\n* [Gin](https://gin-gonic.com/)\n\n## 许可证\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmingslife%2Frtmp-recorder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmingslife%2Frtmp-recorder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmingslife%2Frtmp-recorder/lists"}