본문 바로가기
SW 개발/Android

안드로이드 스마트 폰 오디오 미러링 방법: sndcpy 사용법

by 모바일 SW 개발자 Kibua20 2021. 9. 30.
반응형

안드로이드 스마트의 화면을 PC로 미러링하는 방법에 대해서 아래 포스팅에서 설명하였습니다. 오픈 소스인 scrcpy 기반을 만들어진 소프트웨어로 스마트 폰의 오디오는 PC로 송출하지 못합니다.  

 

scrcpy의 개발자가 Audio 미러링이 가능한 sndcpy 개발하였으며, 실제 테스트 해본 결과 잘 동작하여 본 포스팅을 작성하였습니다.  sndcpy의 blog는 아래 링크를 확인 부탁드립니다.    

 

필요 조건

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)를 사전에 확인 필요 

PC에서 adb 설정 및 VLC 설치 확인

 

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을 다운로드하면 됩니다. 

 

GitHub에서 직접 다운로드하는 명령어는 다음과 같습니다. 

$ curl -L -O https://github.com/rom1v/sndcpy/releases/download/v1.0/sndcpy-v1.0.zip 

$ unzip sndcpy-v1.0.zip 

 

sndcpy 설치 방법 및 파일

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 동작 방식

 

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.apk의 동작

 

sndcpy 실행

스마트 폰을 PC와 USB로 연결하고 리눅스에서는 Bash에서 ./sndcpy를 실행하고, Windows에서는 명령어 프롬프트(cmd창)에서 sndcpy.bat를 실행합니다. 우분투 20.04에서 ./sndcpy를 실행하면 아래와 같은 메시지를 출력합니다.  만일 스마트 폰 OS 가 Android 10 (Q-OS) 이하 버전이라면 sndcpy.apk 설치 시 INSTALL_FAILED_OLDER_SDK 에러가 발생합니다. 

 

sndcpy 실행

스마트 폰에 sndcpy.apk가 정상적으로 설치되었다면 Audio Recording을 위한 Permission 동의 팝업을 표시합니다. Audio 녹화/전송을 시작하면 스마트 폰과 PC에서도 소리가 동시에 송출되고, 스마트 폰의 소리를 off 해도 그대로 PC 스피커는 그대로 출력되고 있습니다. Audio latency는 체감상 50ms 이로 느껴지며, 뮤직 비디오를 봐도 AV sync는 잘 맞습니다.  ADB를 사용하기 때문에 무선 연결도 가능하지만 이 경우 Latency는 USB보다는 다소 심할 것으로 것으로 예상됩니다. 

sndcpy 실행 - 권한 동의 팝업

scrcpy와  sndcpy는 독립적으로 실행 가능합니다. Youtube화면은 scrcpy로 미러링하고 Audio는 sndcpy를 사용해서 미러링하고 있는 화면입니다.  ※ Android 11 에서 동작을 확인했습니다. 

 

scrcpy와 sndcpy 동시 실행

 

scrcpy와  sndcpy를 활용하는 방법은 아래 영상을 참고하세요. 

출처: www.youtube.com/watch?v=zTYYdPS4SOA

 

유용한 댓글

댓글 중 유용한 내용이 있어 블로그 본문에 작성합니다. 

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 사용법

[모바일 SW 개발/Android] - Android 11 기능 소개

반응형



댓글22

  • 좋은 정보 감사합니다~^^
    답글

  • vlc를 어디에? 2021.08.21 03:55

    vlc를 어디에 설치해야해요? 잘 모르게써요 ㅠ
    답글

  • Favicon of https://apartfall.tistory.com BlogIcon 부폭 2021.09.06 06:23 신고

    이 기능 엄청 찾았는데 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
    답글

    • 해결하셨다니 다행입니다.

      activity를 강제 종료하는 경우 리소스 해제가 안되는 경우는 없을까요? sndcpy 소스에서 리소스 정리하는 api를 찾아보는 것이 좋을 것 같습니다.

  • 너무어려워요 2021.09.07 11:10

    vlc를 path에 추가하라는 거 정확히 어떤 말씀이신 지 설명드려도 될까요 ㅜ
    답글

    • VLC 프로그램을 설치하고 터미널에서 실행이 가능하도록 PATH를 등록하는 것을 의미 합니다.

      예를 들어 VLC 프로그램 설치 위치가 C:\Program Files\VLC 라면 해당 경로를 환경변수 PATH에 추가하시면 됩니다.

      VLC 설치 프로그램 다운로드: https://www.videolan.org/vlc/index.ko.html

      Path 등록:
      https://rootblog.tistory.com/206

  • 모르겠어요 2021.09.19 21:48

    Waiting for device...
    Performing Streamed Install
    adb: failed to stat sndcpy.apk: No such file or directory
    Uninstalling existing version first...

    Exception occurred while executing:
    java.lang.IllegalArgumentException: Unknown package: com.rom1v.sndcpy
    at com.android.server.pm.Settings.getInstallerPackageNameLPr(Settings.java:4649)
    at com.android.server.pm.PackageManagerService.getInstallerPackageName(PackageManagerService.java:26519)
    at com.android.server.pm.PackageManagerService.isOrphaned(PackageManagerService.java:26525)
    at com.android.server.pm.PackageManagerService.deletePackageVersioned(PackageManagerService.java:22144)
    at com.android.server.pm.PackageInstallerService.uninstall(PackageInstallerService.java:1063)
    at com.android.server.pm.PackageManagerShellCommand.runUninstall(PackageManagerShellCommand.java:1701)
    at com.android.server.pm.PackageManagerShellCommand.onCommand(PackageManagerShellCommand.java:206)
    at android.os.ShellCommand.exec(ShellCommand.java:104)
    at com.android.server.pm.PackageManagerService.onShellCommand(PackageManagerService.java:27148)
    at android.os.Binder.shellCommand(Binder.java:916)
    at android.os.Binder.onTransact(Binder.java:790)
    at android.content.pm.IPackageManager$Stub.onTransact(IPackageManager.java:5452)
    at com.android.server.pm.PackageManagerService.onTransact(PackageManagerService.java:5158)
    at android.os.Binder.execTransactInternal(Binder.java:1056)
    at android.os.Binder.execTransact(Binder.java:1029)
    Failed with error #255.
    계속하려면 아무 키나 누르십시오 . . .

    이런 에러도 뜨네요...
    답글

  • 홍미노트 2021.09.23 16:57

    홍미노트 사용자입니다. 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...

    이런창이 뜨지만 사운드는 휴대폰에서만 나옵니다. 제가 빼먹은 과정이 있을까요 ?? 알려주시면 감삭하겠습니다
    윈도우 사용자 입니다
    답글

    • BlogIcon 홍미노트 2021.09.23 17:08

      방금 vlc 폴더 경로 환경변수 path 추가도 했습니다 근데도 안되네요

    • BlogIcon 홍미노트 2021.09.23 18:47

      업데이트를 안하고 뻐팅기고있었는데, 안드로이드 10Q 버전에서, 11버전으로 업글하니 들립니다. 좋은 정보 감사드립니다.

      혹시 볼륨조절기능은 따로 없는거 맞나요??

    • 답변이 늦었습니다. android 10 이상이면 동작하는데 흥미노트는 11이 필요하군요. 성공해서 다행입니다.
      볼륨 조절 기능을 따로 없습니다.

    • BlogIcon 짱구 2021.09.30 18:10

      저도 동일 증상이였는데
      우선 윈7에서는 잘 되었는데
      윈10으로 변경하고 나서부터
      저렇게 동일한 메시지 떠도 사운드 미러링이 안되더라구요.

      해결한 방법은
      adb uninstall com.rom1v.sndcpy
      일단 이 명령어로 입력한다음에 다시 하니깐 성공하였습니다.

  • 궁금증 2021.11.11 16:26

    안녕하세요 글을 잘 읽어보고 실행하려 하는데 다 되는데 소리가 안나오네요 ㅜㅜ

    스마트 폰을 PC와 USB로 연결하고 리눅스에서는 Bash에서 ./sndcpy를 실행하고, Windows에서는 명령어 프롬프트(cmd창)에서 sndcpy.bat를 실행합니다. 우분투 20.04에서 ./sndcpy를 실행하면 아래와 같은 메시지를 출력합니다.

    글에 나온거처럼 침착하게 따라하다가 마지막에 (리눅스에서는 Bash에서 ./sndcpy를 실행하고) 이부분에서 막히는데요.
    제가 리눅스를 한번도 사용해보지 않은 사람이라 그런데, 인터넷으로 나름 찾아보니 리눅스를 새로운 드라이브에 설치 해야 하는것 같은데 맞나요?
    즉, 윈도우가 설치된 드라이브를 제외한 다른 하드디스크에 리눅스를 설치한 후에, 저대로 실행하면 되는건지 궁금하네요. 리눅스를 설치하지 않은채 그냥 실행해봤더니, 핸드폰에서 sndcpy로 녹화 또는 전송을 시작하시겠습니까 라는 창은 잘 뜨는데 정작 소리는 폰에서만 나오네요 ㅎㅎ.. 아무래도 리눅스에서 저걸 실행하지 않아서 그런거 같은데 리눅스를 설치해서 하면 되는건지요?
    답글

    • adb하구 vlc가 설치 되어 있어야 합니다. vlc설치하셨나요?

    • 그리로 단말이 안드로이드10 이후 버전이여야 해이

    • BlogIcon 궁금증 2021.11.12 06:25

      네 글에 나온대로 vlc랑 adb 다 설치했고, 핸드폰은 z플립3최신폰이라 버전은 문제가 없네요.
      리눅스를 설치하지 않아서 안되는건가 싶기도 하고..
      sndcpy로 녹화 또는 전송을 시작하시겟습니까 창은 뜨는데 지금 시작을 누르면 컴퓨터에선 폰 화면이 안뜨네요.
      원래 녹화 또는 전송을 시작하시겠습니까에 지금 시작을 누르면 pc에 스마트폰 화면이 떠야 하는건가요?
      저는 scrcpy로 화면을 띄우는거고, sndcpy로 소리만 가져오는것으로 이해했는데 이게 맞는지요?
      아니면 sndcpy만 실행해도 화면과 소리를 전부 pc에 띄울수 있는건가요?
      scrcpy는 쉽게 했는데 소리가 안나오길래 sndcpy를 도전해보는데 어렵네요 ㅎㅎ

    • sndcpy는 사운드만 출력하는 것입고, 화면은 scrcpy 입니다. sndcpy 단독으로 실행해도 문제없고 사운드만 출력됩니다.

      글 내용만 봐서는 어떤 점이 문제인지 알수가 없네요. 에러 메시지라도 없는지요?

    • BlogIcon 궁금증 2021.11.14 09:21

      아 sndcpy는 소리만, scrcpy가 화면만 출력 즉, 제가 이해한게 맞군요

      cmd가서

      adb devices 이거 치면

      List of devices attached
      R3CR90E7RDT device

      이렇게 나오고 sndcpy.bat 을 실행시키면 폰화면에 녹화 또는 전송을 시작하시겠습니까 팝업도 그대로 뜹니다.
      어떤 에러 메세지도 안뜨네요
      vlc도 설치되어 있어서 다시 한 번 제거 했다가 설치해봤네요.
      뭐가 문제인지는 잘 모르겠지만 일단 계속 시도해보려합니다. 아무쪼록 답변 감사합니다. 즐거운 주말 보내세요.

      //

      아 선생님, 선생님이 써주신 댓글들을 쭉 읽어봤는데 vlc도 adb처럼 환경 변수-시스템변수- path편집에 진입하여 설치한 경로를 추가해줘야 하는건가요??

      //
      댓글 보고 이것저것 따라하니까 되네요 ㅎㅎ 감사합니다 선생님 즐거운 주말 보내세요!

    • Path 설정하고 성공하신거죠..? 축하드립니다~~ ^^