안드로이드 스마트의 화면을 PC로 미러링하는 방법에 대해서 아래 포스팅에서 설명하였습니다. 오픈 소스인 scrcpy 기반을 만들어진 소프트웨어로 스마트 폰의 오디오는 PC로 송출하지 못합니다.
- [모바일 SW 개발/Android] - 안드로이드 스마트 폰 화면 미러링 방법: scrcpy 사용법
- [모바일 SW 개발/Android] - Android 스마폰을 PC 화면으로 미러링: Mirroid
scrcpy의 개발자가 Audio 미러링이 가능한 sndcpy을 개발하였으며, 실제 테스트 해본 결과 잘 동작하여 본 포스팅을 작성하였습니다. sndcpy의 blog는 아래 링크를 확인 부탁드립니다.
- blog.rom1v.com/2020/06/audio-forwarding-on-android-10/
- Audio forwarding Issue: issue #14
필요 조건
sndcpy가 동작하기 위한 필요한 조건입니다. sndcpy는 adb의 port forwarding을 사용하고 있어 adb가 동작해야 하고, 스마트 폰은 Android 10 (Q-OS) 이상 버전에서 동작합니다. Adb USB 연결과 함께 VLC에서 pcm stream을 받아서 Play 하기 때문에 VLC가 PC에 설치되어 있어야 합니다. sndcpy는 scrcpy와 독립적으로 동작하고 있어 scrcpy는 꼭 설치할 필요는 없지만 scrcpy와 sndcpy를 같이 활용하면 Video와 Audio를 모두 미러링 할 수 있습니다.
- 스마트 폰의 Android OS 버전이 10 (Q-OS) 이상
- PC에서는 USB 연결 확인 (adb devices 명령어 확인): ADB가 설정 방법은 kibua20.tistory.com/165를 확인해주세요.
- PC에서 VLC 프로그램 설치 확인 (VLC 설명은 링크를 참조해주세요)
- Audio 미러링 동작은 확인 시 사운드 Path (=출력 device)를 사전에 확인 필요
sndcpy 설치 방법
Windows와 Linux에서는 github.com/rom1v/sndcpy/releases/tag/v1.0에서 다운로드 가능합니다. PC OS에 상관없이 ADB가 이미 설치되어 있다면 sndcpy-v1.0.zip 파일만 다운로드하면 되고, adb 가 설치되지 않은 경우에는 sndcpy-with-adb-windows-v1.0.zip을 다운로드하면 됩니다.
- sndcpy-v1.0.zip
SHA256: 4495f752fc192535cd5208ace4d35d2ba644beb9aabb0e288ae339861ad6782b - sndcpy-with-adb-windows-v1.0.zip
SHA256: 42b89b7b557b9fdf0c6f3802eac171a0e5610a50a1d615a290ed7f41cba7053d
GitHub에서 직접 다운로드하는 명령어는 다음과 같습니다.
$ curl -L -O https://github.com/rom1v/sndcpy/releases/download/v1.0/sndcpy-v1.0.zip
$ unzip sndcpy-v1.0.zip
sndcpy-v1.0.zip 파일을 압축을 풀면 sndcpy, sndcpy.bat, sndcpy.apk 파일 3개가 있습니다. 각각의 내용은 다음과 같습니다.
- sndcpy.apk: 스마트 폰에 설치되어 Audio 데이터를 socket으로 전송
- sncpy: Bash 용 shell script입니다. sndcpy.apk를 설치하고 ADB를 사용해서 스마트 폰의 Audio를 데이터를 USB로 전송을 위한 adb port forwarding과 VLC demux 기능을 실행합니다.
- sndcpy.bat: Windows 용 batch파일로 sndcpy bash script와 동일하게 동작합니다.
sndcpy 동작 방식
본 section의 sndcpy는 동작 방식은 스마트 폰에 설치되는 sndcpy.apk가 악성 코드가 있는지 살펴보다가 정리를 했습니다. sndcpy를 동작시키는데 꼭 필요한 내용은 아니지만 관심이 있는 분은 참고해도 좋을 것 같습니다.
sndcpy의 동작 방식을 그림으로 표현하면 Android Device에 설치된 sndcpy.apk에서 Audio 데이터를 sndcpy socket으로 전송합니다. 그리고, ADB의 port forwarding 기능 활용해서 PC의 tcp:28200으로 Audio 데이터를 전달하고 이를 VLC에서 PCM streaming을 읽어서 decoding 합니다. VLC의 demux 기능을 사용해서 tcp 포트의 PCM raw data를 읽어 사운드를 출력합니다. 각 단계별 구체적인 내용은 내용은 아래 bash script와 sndcpy.apk의 소스에서 확인이 가능합니다.
sndcpy bash script에서는 adb 연결하고 adb forward [Local] [Device] 명령어로 adb port forwarding을 구성한 다음에 sndcpy.apk의 Main Activity로 Intent를 날려 Apk에서 Audio capture를 triggering 하고 VLC demux 기능을 시작합니다.
#!/bin/bash
set -e
ADB=${ADB:-adb}
VLC=${VLC:-vlc}
SNDCPY_APK=${SNDCPY_APK:-sndcpy.apk}
SNDCPY_PORT=${SNDCPY_PORT:-28200}
serial=
if [[ $# -ge 1 ]]
then
serial="-s $1"
echo "Waiting for device $1..."
else
echo 'Waiting for device...'
fi
"$ADB" $serial wait-for-device
"$ADB" $serial install -t -r -g "$SNDCPY_APK" ||
{
echo 'Uninstalling existing version first...'
"$ADB" $serial uninstall com.rom1v.sndcpy
"$ADB" $serial install -t -g "$SNDCPY_APK"
}
"$ADB" $serial forward tcp:$SNDCPY_PORT localabstract:sndcpy
"$ADB" $serial shell am start com.rom1v.sndcpy/.MainActivity
echo "Press Enter once audio capture is authorized on the device to start playing..."
read dummy
"$VLC" -Idummy --demux rawaud --network-caching=50 --play-and-exit tcp://localhost:"$SNDCPY_PORT"
아래는 스마트 폰의 sndcpy.apk의 코드 중 일부입니다. Audio Recorder로 읽은 데이터를 linux socket으로 15ms 데이터를 모아서 writing 하는 역할입니다.
sndcpy 실행
스마트 폰을 PC와 USB로 연결하고 리눅스에서는 Bash에서 ./sndcpy를 실행하고, Windows에서는 명령어 프롬프트(cmd창)에서 sndcpy.bat를 실행합니다. 우분투 20.04에서 ./sndcpy를 실행하면 아래와 같은 메시지를 출력합니다. 만일 스마트 폰 OS 가 Android 10 (Q-OS) 이하 버전이라면 sndcpy.apk 설치 시 INSTALL_FAILED_OLDER_SDK 에러가 발생합니다.
스마트 폰에 sndcpy.apk가 정상적으로 설치되었다면 Audio Recording을 위한 Permission 동의 팝업을 표시합니다. Audio 녹화/전송을 시작하면 스마트 폰과 PC에서도 소리가 동시에 송출되고, 스마트 폰의 소리를 off 해도 그대로 PC 스피커는 그대로 출력되고 있습니다. Audio latency는 체감상 50ms 이로 느껴지며, 뮤직 비디오를 봐도 AV sync는 잘 맞습니다. ADB를 사용하기 때문에 무선 연결도 가능하지만 이 경우 Latency는 USB보다는 다소 심할 것으로 것으로 예상됩니다.
scrcpy와 sndcpy는 독립적으로 실행 가능합니다. Youtube화면은 scrcpy로 미러링하고 Audio는 sndcpy를 사용해서 미러링하고 있는 화면입니다. ※ Android 11 에서 동작을 확인했습니다.
scrcpy와 sndcpy를 활용하는 방법은 아래 영상을 참고하세요.
유용한 댓글
댓글 중 유용한 내용이 있어 블로그 본문에 작성합니다.
sndcpy 중지 방법:
sndcpy 기능을 중지시키는 명령어가 필요한데요. ADB로 sndcpy.apk가 capture하는 기능을 중지시킬 수 있을까요? forward 쪽이나 shell am start 를 stop 한다거나 하면 될 것 같은데, 잘 모르겠습니다. -> 답을 찾았습니다. ^^
adb -s 192.168.0.85:5555 shell am force-stop com.rom1v.sndcpy
문제점: 흥미노트에서 정상 동작하지 않음
홍미노트 사용자입니다. audio forwarding enabled 라고 뜨는데 사운드 미러링이 안되네요
1. vlc 설치 2. 개발자옵션에서 usb로 설치허용 체크 3. sndcpt.bat 실행
Waiting for device...
Performing Streamed Install
Success
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.rom1v.sndcpy/.MainActivity }
Press Enter once audio capture is authorized on the device to start playing...
Playing audio...
Android 11 로 업데이트 후 정상 동작 (이유는 정확하게 알수 없음)
업데이트를 안하고 뻐팅기고있었는데, 안드로이드 10Q 버전에서, 11버전으로 업글하니 들립니다. 좋은 정보 감사드립니다.
App 설치
해결한 방법은 adb uninstall com.rom1v.sndcpy 일단 이 명령어로 입력한다음에 다시 하니깐 성공하였습니다.
출처:
https://kibua20.tistory.com/182
[모바일 SW 개발자가 운영하는 블로그]
관련 글
[모바일 SW 개발/Android] - 안드로이드 스마트 폰 화면 미러링 방법: scrcpy 사용법
[개발환경/Tips] - Spotify 한국에서 사용하는 방법
[모바일 SW 개발/Android] - Android 스마폰을 PC 화면으로 미러링: Mirroid
[모바일 SW 개발/Android] - 안드로이드 adb 설치 및 설정 방법
[모바일 SW 개발/REST API] - 자주 사용하는 curl 명령어 옵션과 예제
[개발환경/우분투] - Ubuntu 동영상 플레이어: VLC Player 설치
[개발환경/Tips] - youtube-dl로 Youtube에서 MP3 다운로드 시 아티스트와 앨범 아트(meta data) 포함시키는 방법
[모바일 SW 개발/Android] - Android apk Decompile 과 분석 tool: apktool 사용법
댓글