m3u8를 mp4로 변환 (ffmpeg 이용)

** 2024년 4월 : 내용 변경 및 추가함

ffmpeg 프로그램 설치

우선 ffmpeg 프로그램을 설치해야 합니다. 설치 방법은 운영체제에 따라서 다양한 방법이 있습니다.

리눅스

우선 리눅스를 사용한다면 apt-get을 이용해서 설치하면 됩니다.

Bash Copy
<span class="line"><span style="color: #88C0D0">vividian@user:~$</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">sudo</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">apt-get</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">install</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">ffmpeg</span></span>

윈도우

윈도우의 경우에는 프로그램을 다운로드 받아 설치하거나, 패키지 매니저를 통해 설치해도 됩니다.

윈도우 패키지 매니저를 이용
윈도우11 에는 winget 이라는 마이크로소프트에서 제공하는 패키지 매니저가 있습니다. 윈도우키 + ‘R’ 키를 눌러 실행창을 띄우거나, 윈도우 검색창에서 “cmd” 를 검색하여 명령 프롬프트를 관리자 권한으로 실행합니다.
winget search ffmpeg 으로 패키지를 검색하고,
winget install Gyan.FFmpeg 으로 패키지를 설치합니다.

Bash winget search ffmpeg 이름 장치 ID 버전 일치 원본 ———————————————————————————– FFmpeg Gyan.FFmpeg 7.0 winget Wav2Bar Picorims.wav2bar 0.3.0 Tag: ffmpeg winget y2mp3 moshfeu.y2mp3 2.5.9 Tag: ffmpeg winget FFmpeg (Shared) Gyan.FFmpeg.Shared 7.0 Tag: ffmpeg winget FFmpeg (Essentials Build) Gyan.FFmpeg.Essentials 7.0 Tag: ffmpeg winget cyanrip cyanreg.cyanrip 0.9.2 Tag: ffmpeg winget FFmpeg Batch AV Converter eibol.FFmpegBatchAVConverter 2.8.1 winget Videomass GianlucaPernigotto.Videomass 3.5.8 Tag: ffmpeg-gui winget C:\Users\vividian>winget install Gyan.FFmpeg 찾음 FFmpeg [Gyan.FFmpeg] 버전 7.0 이 응용 프로그램의 라이선스는 그 소유자가 사용자에게 부여했습니다. Microsoft는 타사 패키지에 대한 책임을 지지 않고 라이선스를 부여하지도 않습니다. 다운로드 중 https://github.com/GyanD/codexffmpeg/releases/download/7.0/ffmpeg-7.0-full_build.zip ████████████▏ 65.3 MB / 160 MB” style=”color:#2e3440ff;display:none;background-color:#d8dee9ff” aria-label=”Copy” data-copied-text=”Copied!” data-has-text-button=”textSimple” data-inside-header-type=”simpleString” aria-live=”polite” class=”code-block-pro-copy-button”>Copy
<span class="line"><span style="color: #88C0D0">C:\Users\vividian>winget</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">search</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">ffmpeg</span></span>
<span class="line"><span style="color: #88C0D0">이름</span>
<span style="color: #D8DEE9FF">                      </span>
<span style="color: #A3BE8C">장치</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">ID</span>
<span style="color: #D8DEE9FF">                      </span>
<span style="color: #A3BE8C">버전</span>
<span style="color: #D8DEE9FF">  </span>
<span style="color: #A3BE8C">일치</span>
<span style="color: #D8DEE9FF">            </span>
<span style="color: #A3BE8C">원본</span></span>
<span class="line"><span style="color: #88C0D0">-----------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #88C0D0">FFmpeg</span>
<span style="color: #D8DEE9FF">                    </span>
<span style="color: #A3BE8C">Gyan.FFmpeg</span>
<span style="color: #D8DEE9FF">                  </span>
<span style="color: #B48EAD">7.0</span>
<span style="color: #D8DEE9FF">                   </span>
<span style="color: #A3BE8C">winget</span></span>
<span class="line"><span style="color: #88C0D0">Wav2Bar</span>
<span style="color: #D8DEE9FF">                   </span>
<span style="color: #A3BE8C">Picorims.wav2bar</span>
<span style="color: #D8DEE9FF">             </span>
<span style="color: #B48EAD">0.3</span>
<span style="color: #A3BE8C">.0</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">Tag:</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">ffmpeg</span>
<span style="color: #D8DEE9FF">     </span>
<span style="color: #A3BE8C">winget</span></span>
<span class="line"><span style="color: #88C0D0">y2mp3</span>
<span style="color: #D8DEE9FF">                     </span>
<span style="color: #A3BE8C">moshfeu.y2mp3</span>
<span style="color: #D8DEE9FF">                </span>
<span style="color: #B48EAD">2.5</span>
<span style="color: #A3BE8C">.9</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">Tag:</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">ffmpeg</span>
<span style="color: #D8DEE9FF">     </span>
<span style="color: #A3BE8C">winget</span></span>
<span class="line"><span style="color: #88C0D0">FFmpeg</span>
<span style="color: #D8DEE9FF"> (Shared)           Gyan.FFmpeg.Shared           7.0   Tag: ffmpeg     winget</span></span>
<span class="line"><span style="color: #88C0D0">FFmpeg</span>
<span style="color: #D8DEE9FF"> (Essentials </span>
<span style="color: #A3BE8C">Build</span>
<span style="color: #D8DEE9FF">) Gyan.FFmpeg.Essentials       7.0   Tag: ffmpeg     winget</span></span>
<span class="line"><span style="color: #88C0D0">cyanrip</span>
<span style="color: #D8DEE9FF">                   </span>
<span style="color: #A3BE8C">cyanreg.cyanrip</span>
<span style="color: #D8DEE9FF">              </span>
<span style="color: #B48EAD">0.9</span>
<span style="color: #A3BE8C">.2</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">Tag:</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">ffmpeg</span>
<span style="color: #D8DEE9FF">     </span>
<span style="color: #A3BE8C">winget</span></span>
<span class="line"><span style="color: #88C0D0">FFmpeg</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">Batch</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">AV</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">Converter</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">eibol.FFmpegBatchAVConverter</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #B48EAD">2.8</span>
<span style="color: #A3BE8C">.1</span>
<span style="color: #D8DEE9FF">                 </span>
<span style="color: #A3BE8C">winget</span></span>
<span class="line"><span style="color: #88C0D0">Videomass</span>
<span style="color: #D8DEE9FF">                 </span>
<span style="color: #A3BE8C">GianlucaPernigotto.Videomass</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #B48EAD">3.5</span>
<span style="color: #A3BE8C">.8</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">Tag:</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">ffmpeg-gui</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">winget</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">C:\Users\vividian>winget</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">install</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">Gyan.FFmpeg</span></span>
<span class="line"><span style="color: #88C0D0">찾음</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">FFmpeg</span>
<span style="color: #D8DEE9FF"> [Gyan.FFmpeg] 버전 7.0</span></span>
<span class="line"><span style="color: #88C0D0">이</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">응용</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">프로그램의</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">라이선스는</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">그</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">소유자가</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">사용자에게</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">부여했습니다.</span></span>
<span class="line"><span style="color: #88C0D0">Microsoft는</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">타사</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">패키지에</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">대한</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">책임을</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">지지</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">않고</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">라이선스를</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">부여하지도</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">않습니다.</span></span>
<span class="line"><span style="color: #88C0D0">다운로드</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">중</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">https://github.com/GyanD/codexffmpeg/releases/download/7.0/ffmpeg-7.0-full_build.zip</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span>
<span style="color: #88C0D0">████████████▏</span>
<span style="color: #D8DEE9FF">                   </span>
<span style="color: #B48EAD">65.3</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">MB</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">/</span>
<span style="color: #D8DEE9FF">  </span>
<span style="color: #B48EAD">160</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">MB</span></span>

Scoop 패키지 매니저를 사용
scoop을 이용한다면, scoop install ffmpeg 명령어를 입력하여 간단하게 ffmpeg을 설치할 수 있습니다.

Bash scoop install ffmpeg Updating Scoop… Installing ‘ffmpeg’ (5.0) [64bit] ffmpeg-5.0-full_build.7z (41.7 MB) [==========================================================================] 100% Checking hash of ffmpeg-5.0-full_build.7z … ok. Extracting ffmpeg-5.0-full_build.7z … done. Linking ~\Scoop\apps\ffmpeg\current => ~\Scoop\apps\ffmpeg\5.0 Creating shim for ‘ffmpeg’. Creating shim for ‘ffplay’. Creating shim for ‘ffprobe’. Running post-install script… ‘ffmpeg’ (5.0) was installed successfully!” style=”color:#2e3440ff;display:none;background-color:#d8dee9ff” aria-label=”Copy” data-copied-text=”Copied!” data-has-text-button=”textSimple” data-inside-header-type=”simpleString” aria-live=”polite” class=”code-block-pro-copy-button”>Copy
<span class="line"><span style="color: #88C0D0">C:\Users\vividian></span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">scoop</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">install</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">ffmpeg</span></span>
<span class="line"><span style="color: #88C0D0">Updating</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">Scoop...</span></span>
<span class="line"><span style="color: #88C0D0">Installing</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #ECEFF4">'</span>
<span style="color: #A3BE8C">ffmpeg</span>
<span style="color: #ECEFF4">'</span>
<span style="color: #D8DEE9FF"> (5.0) </span>
<span style="color: #ECEFF4">[</span>
<span style="color: #B48EAD">64</span>
<span style="color: #D8DEE9FF">bit</span>
<span style="color: #ECEFF4">]</span></span>
<span class="line"><span style="color: #88C0D0">ffmpeg-5.0-full_build.7z</span>
<span style="color: #D8DEE9FF"> (41.7 </span>
<span style="color: #A3BE8C">MB</span>
<span style="color: #D8DEE9FF">) </span>
<span style="color: #ECEFF4">[</span>
<span style="color: #81A1C1">==========================================================================</span>
<span style="color: #ECEFF4">]</span>
<span style="color: #D8DEE9FF"> 100%</span></span>
<span class="line"><span style="color: #88C0D0">Checking</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">hash</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">of</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">ffmpeg-5.0-full_build.7z</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">...</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">ok.</span></span>
<span class="line"><span style="color: #88C0D0">Extracting</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">ffmpeg-5.0-full_build.7z</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">...</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">done.</span></span>
<span class="line"><span style="color: #88C0D0">Linking</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">~</span>
<span style="color: #EBCB8B">\S</span>
<span style="color: #A3BE8C">coop</span>
<span style="color: #EBCB8B">\a</span>
<span style="color: #A3BE8C">pps</span>
<span style="color: #EBCB8B">\f</span>
<span style="color: #A3BE8C">fmpeg</span>
<span style="color: #EBCB8B">\c</span>
<span style="color: #A3BE8C">urrent</span>
<span style="color: #D8DEE9FF"> =</span>
<span style="color: #81A1C1">></span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">~</span>
<span style="color: #EBCB8B">\S</span>
<span style="color: #A3BE8C">coop</span>
<span style="color: #EBCB8B">\a</span>
<span style="color: #A3BE8C">pps</span>
<span style="color: #EBCB8B">\f</span>
<span style="color: #A3BE8C">fmpeg</span>
<span style="color: #EBCB8B">\5</span>
<span style="color: #A3BE8C">.0</span></span>
<span class="line"><span style="color: #88C0D0">Creating</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">shim</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">for</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #ECEFF4">'</span>
<span style="color: #A3BE8C">ffmpeg</span>
<span style="color: #ECEFF4">'</span>
<span style="color: #A3BE8C">.</span></span>
<span class="line"><span style="color: #88C0D0">Creating</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">shim</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">for</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #ECEFF4">'</span>
<span style="color: #A3BE8C">ffplay</span>
<span style="color: #ECEFF4">'</span>
<span style="color: #A3BE8C">.</span></span>
<span class="line"><span style="color: #88C0D0">Creating</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">shim</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">for</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #ECEFF4">'</span>
<span style="color: #A3BE8C">ffprobe</span>
<span style="color: #ECEFF4">'</span>
<span style="color: #A3BE8C">.</span></span>
<span class="line"><span style="color: #88C0D0">Running</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">post-install</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">script...</span></span>
<span class="line"><span style="color: #88C0D0">'ffmpeg'</span>
<span style="color: #D8DEE9FF"> (5.0) was installed successfully</span>
<span style="color: #81A1C1">!</span></span>

직접 사이트에 방문 설치
직접 사이트에 방문하여, ffmpeg 을 빌드한 파일을 통해 설치할 수 있습니다. 아래 링크의 사이트를 방문합니다.
윈도우 버튼을 클릭하면 Windows builds form gyan.dev 를 클릭합니다.
이동한 사이트에서 release builds 메뉴를 선택하고, ffmpeg-release-essentials.zip 파일 다운로드 받습니다.

그러면 이제 ffmpeg 을 사용할 준비가 되었습니다.

.m3u8 파일에서 url 확인

m3u8 파일을 mp4로 변환하려면, m3u8 파일에 포함되어 있는 url 주소를 확인해야 합니다.
크롬 브라우저를 실행하고, F12 버튼 누르면, 개발자 모드가 뜹니다.
m3u8 파일을 플레이 시키고, 개발자 모드 화면의 Network > Filter > All 로 이동합니다.
Name 영역에 .m3u8 파일을 선택합니다.
오른쪽 화면에 Header > General > Request URL 에서 URL 을 복사하면 됩니다.
URL 은 http://주소/파일명.m3u8 으로 되어 있습니다.

mp4로 변환

m3u8 의 url 을 확인했으니, 이제 mp4로 변환하면 됩니다.
윈도우에서 cmd를 실행하고, ffmpeg 명령어를 아래와 같이 입력합니다.
scoop 이나 winget 으로 설치한 경우에는 자동으로 경로가 지정되어 있지만, 사이트에서 직접 다운로드 받은 경우에는 ffmpeg 압축을 풀고, 해당 위치에서 실행하셔야 합니다.

Bash <span role="button" tabindex="0" data-code="ex) ffmpeg -i -bsf:a aac_adtstoasc -vcodec copy -c copy -crf 50 C:\Users\vividian> ffmpeg -i http://test.com/test.m3u8 -bsf:a aac_adtstoasc -vcodec copy -c copy -crf 50 file.mp4″ style=”color:#2e3440ff;display:none;background-color:#d8dee9ff” aria-label=”Copy” data-copied-text=”Copied!” data-has-text-button=”textSimple” data-inside-header-type=”simpleString” aria-live=”polite” class=”code-block-pro-copy-button”>Copy
<span class="line"><span style="color: #88C0D0">ex</span>
<span style="color: #D8DEE9FF">) ffmpeg -i </span>
<span style="color: #81A1C1"><</span>
<span style="color: #D8DEE9FF">URL입력</span>
<span style="color: #81A1C1">></span>
<span style="color: #D8DEE9FF"> -bsf:a aac_adtstoasc -vcodec copy -c copy -crf 50 </span>
<span style="color: #81A1C1"><</span>
<span style="color: #D8DEE9FF">저장할 파일명</span>
<span style="color: #81A1C1">></span></span>
<span class="line"><span style="color: #88C0D0">C:\Users\vividian></span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">ffmpeg</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">-i</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">http://test.com/test.m3u8</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">-bsf:a</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">aac_adtstoasc</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">-vcodec</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">copy</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">-c</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">copy</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">-crf</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #B48EAD">50</span>
<span style="color: #D8DEE9FF"> </span>
<span style="color: #A3BE8C">file.mp4</span></span>

위와 같이 입력하면 m3u8에 정의된 조각난 동영상 파일들을 읽어 들여 mp4 파일 하나로 합쳐줍니다.

참고


0 0 votes
글 만족도 평가하기
guest
0 답글
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
위로 스크롤
0
Would love your thoughts, please comment.x