{"id":13563658,"url":"https://github.com/danielpaulus/quicktime_video_hack","last_synced_at":"2025-05-15T01:08:19.091Z","repository":{"id":41583764,"uuid":"208322713","full_name":"danielpaulus/quicktime_video_hack","owner":"danielpaulus","description":"Record iOS device audio and video","archived":false,"fork":false,"pushed_at":"2023-05-04T10:49:50.000Z","size":23178,"stargazers_count":558,"open_issues_count":59,"forks_count":114,"subscribers_count":25,"default_branch":"main","last_synced_at":"2025-04-13T23:53:36.846Z","etag":null,"topics":["audio","gstreamer","ios","iosscreencaptureassistant","libimobiledevice","macos","quicktime","screenmirror","video"],"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/danielpaulus.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null},"funding":{"github":["danielpaulus"]}},"created_at":"2019-09-13T18:23:46.000Z","updated_at":"2025-04-13T07:55:24.000Z","dependencies_parsed_at":"2023-02-02T20:45:56.502Z","dependency_job_id":"4333bb68-c4ac-41d4-99ed-a665b6f4f7b6","html_url":"https://github.com/danielpaulus/quicktime_video_hack","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielpaulus%2Fquicktime_video_hack","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielpaulus%2Fquicktime_video_hack/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielpaulus%2Fquicktime_video_hack/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielpaulus%2Fquicktime_video_hack/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/danielpaulus","download_url":"https://codeload.github.com/danielpaulus/quicktime_video_hack/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254254042,"owners_count":22039792,"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":["audio","gstreamer","ios","iosscreencaptureassistant","libimobiledevice","macos","quicktime","screenmirror","video"],"created_at":"2024-08-01T13:01:21.829Z","updated_at":"2025-05-15T01:08:14.082Z","avatar_url":"https://github.com/danielpaulus.png","language":"Go","funding_links":["https://github.com/sponsors/danielpaulus"],"categories":["Go"],"sub_categories":[],"readme":"[![](https://dcbadge.vercel.app/api/server/Zr8J3bCdkv)](https://discord.gg/Zr8J3bCdkv)\n[![Gitpod Ready-to-Code](https://img.shields.io/badge/Gitpod-Ready--to--Code-blue?logo=gitpod)](https://gitpod.io/#https://github.com/danielpaulus/quicktime_video_hack)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![CircleCI](https://circleci.com/gh/danielpaulus/quicktime_video_hack.svg?style=svg)](https://circleci.com/gh/danielpaulus/quicktime_video_hack)\n[![codecov](https://codecov.io/gh/danielpaulus/quicktime_video_hack/branch/master/graph/badge.svg)](https://codecov.io/gh/danielpaulus/quicktime_video_hack)\n[![Go Report](https://goreportcard.com/badge/github.com/danielpaulus/quicktime_video_hack)](https://goreportcard.com/report/github.com/danielpaulus/quicktime_video_hack)\n\nRelease 0.6\n\n- qvh without Gstreamer is finally stable on MacOSX. I ran it for 16 hours straight on parallel devices and it worked flawlessly.\n- before a 1.0 Release I need to see if Gstreamer is stable enough and maybe fix or switch to ffmpeg\n- Linux support needs to be improved. It works but it is hard to get going currently.\n- Create an issue if you miss anything\n\n## 1. What is this?\n\nThis is an Operating System indepedent implementation for Quicktime Screensharing for iOS devices :-)\n\n[Check out my presentation](https://danielpaulus.github.io/quicktime_video_hack_presentation)\n\n[See me talk about it at GoWayFest](https://www.youtube.com/watch?v=jghi4nCBRwc)\n\n[See a demo on YouTube](https://youtu.be/8v5f_ybSjHk)\n\nThis repository contains all the code you will need to grab and record video and audio from one or more iPhone(s) or iPad(s)\nwithout needing one of these expensive MacOS X computers or the hard to use QuickTime Player :-D\n\n- You can record video and audio as raw h264 and wave audio in the Apple demonstration mode (Device shows 9:41am, full battery and no cellphone carrier in the status bar)\n- Also you can just grab device audio as wave, ogg or mp3 without the Apple demonstration mode now 🎉\n- You can use custom Gstreamer Pipelines to transcode the AV data into whatever you like\n\n## 2. Installation\n\n### 2.1 Mac OSX\n\n1. On MacOS run `brew install libusb pkg-config gstreamer gst-plugins-bad gst-plugins-good gst-plugins-base gst-plugins-ugly`\n2. To just run: Download the latest release and run it\n3. To develop: Clone the repo and execute `go run main.go` (need to install golang of course)\n\n### 2.2 Linux\n\n1. Run with Docker: the Docker files are [here](https://github.com/danielpaulus/quicktime_video_hack/tree/master/docker). There is one for just building and one for running.\n\n2. If you want to build/run locally then copy paste the dependencies from this [Dockerfile](https://github.com/danielpaulus/quicktime_video_hack/blob/master/docker/Dockerfile.debian) and install with apt.\n3. Git clone the repo and start hacking or download the latest release and run the binary :-D\n\n## 3. Usage\n\n- For just displaying the screen run `qvh gstreamer` and it will work.\n- For just getting raw media output without Gstreamer involved use `qvh record out.h264 out.wav` or `qvh audio out.wav --wav` for audio only\n- For troubleshooting run `qvh diagnostics metrics.csv --dump=binary.bin` which will persist logs to a file, dump all usb transfers and gather metrics.\n- See `qvh gstreamer --examples` for transcoding media or streaming.\n- For creating mp3 or ogg in audio only mode see `qvh audio out.mp3 --mp3` and `qvh audio out.ogg --ogg`\n\n## 4. Technical Docs/ Roll your own implementation\n\nQVH probably does something similar to what `QuickTime` and `com.apple.cmio.iOSScreenCaptureAssistant` are doing on MacOS.\nI have written some documentation here [doc/technical_documentation.md](https://github.com/danielpaulus/quicktime_video_hack/blob/master/doc/technical_documentation.md)\nSo if you are just interested in the protocol or if you want to implement this in a different programming language than golang, read the docs.\nAlso I have extracted binary dumps of all messages for writing unit tests and re-develop this in your preferred language in a test driven style.\n\nI have given up on windows support :-)\n~~[Port to Windows](https://github.com/danielpaulus/quicktime_video_hack/tree/windows/windows) (I don't know why, but still people use Windows nowadays)~~ Did not find a way to do it\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdanielpaulus%2Fquicktime_video_hack","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdanielpaulus%2Fquicktime_video_hack","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdanielpaulus%2Fquicktime_video_hack/lists"}