본문 바로가기

연구/인코딩

[ffmpeg] mp4파일로 mpd 만들기

ffmpeg을 자주 쓰지 않다보니 매 번 할때마다 검색하는게 보통일이 아니다..


mp4파일을 이용해서 다양한 화질을 가진 mpd파일을 만들어보자!




기본적인 순서는 이렇다.


1. mp4 파일에서 오디오 트랙 꺼내기


2. mp4파일을 다양한 화질로 인코딩하기


3. 다양한 화질의 mp4(꼭 mp4가 아니어도 된다.)를 mpd로 만들어준다.



나는 mp4 --> webM(vp9이용) --> mpd 방법을 사용했다.


우선 ffmpeg이 필요하다.


https://www.ffmpeg.org/download.html


위의 사이트에서 운영체제에 맞는 빌드된 ffmpeg을 다운 받자! (사용할 때에는 cmd 창에서 ffmpeg 폴더의 bin에 들어가서 적당한 스크립트를 써주면 된다.)



*** 비디오의 메타데이터 확인하는방법 ***

ffmpeg -i {input_video}

위의 라인만 작성하면 메타데이터가 쭈루룩 나온다.. 오디오트랙, fps, 코덱 등등..! 나중에 요긴하게 사용하자



1. 오디오 트랙 꺼내기

ffmpeg -i main.mp4 -c:a aac -ac 2 -ab 128k -vn sample-audio.mp4


위의 커맨드로 오디오 트랙을 꺼내자..! main.mp4에는 나의 video file name을 적어주면 되고 sample-audio는 output이다.


2. mp4 파일을 다양한 화질로 인코딩하기


s = f"{ffmpeg} -i {input_video} " \
f"-c:v libx264 -x264opts " \
f"\"keyint={round(fps[video])}:min-keyint={round(fps[video])}:no-scenecut\" " \
f"-vf \"scale={size}\" {output_video}"


원하는 만큼, 원하는 화질로 비디오를 뽑아낸다.


파이썬 으로 자동화 했다. multi representation을 만들라면 x264 option에서 keyint, key frame alignment를 맞춰줘야한다고 한다. (dash segment 길이에 맞춰야 한다.)

- 출처 https://github.com/gpac/gpac/wiki/Check-key-frame-alignment-with-MP4Box



3. mpd 만들기

MP4Box -dash 4000 -frag 4000 -rap -profile live -out mpd\dash.mpd video-720.mp4 video-480.mp4 video-360.mp4 video-240.mp4 sample-audio.mp4


**수정


MP4Box -dash 2000 -profile onDemand -out mpd2\dash.mpd video-720.mp4 video-480.mp4 video-360.mp4 video-240.mp4 sample-audio.mp4


mp4box를 이용해서 dash를 만들 때, -profile의 옵션으로 여러가지 옵션을 줄 수 있다.


live 옵션을 줬을 때에는 청크가 모두 조각난 상태로 보이게 되고

onDemand 옵션을 줬을 때에는 아래와 같이 각각의 해상도 별 init 파일만 존재 하게 된다.



onDemand 옵션을 줬을 떄 결과



https://gpac.wp.imt.fr/mp4box/dash/


위의 mp4 박스 링크를 타고 들어가면 mp4box 옵션의 정보를 알 수 있다. 그런데 profile의 구체적인 파라미터 설명이 나와있지는 않았다..


구동 했을 떄 onDemand 옵션을 줬을 때 dash로 작동 했다.(adaptive streaming, 영상 중간부터 segment 요청)


하지만 live 옵션을 줬을 떄에는 영상 중간부터 segment 요청 시 오류가 발생해 무한 버퍼링에 걸려버리게 되었다...


------------------------------------------------




마지막으로 비디오와 오디오를 합쳐서 mpd를 만들어준다.


나는 MP4Box를 이용하였다. ffmpeg 을 이용해서 만들 수 있지만 이것 저것 파라미터 추가해야하고, 복잡한 부분이 많이 있었다..


https://gpac.wp.imt.fr/downloads/gpac-nightly-builds/


mp4box 다운로드 운영체제별로 간단하게 빌드버전을 다운받을 수 있다.


MP4Box는 위의 커맨드 라인과 같이 간단하다.


여러 화질로 인코딩한 비디오와 오디오트랙을 쭈루룩 나열해서 적어주면 된다.


dash, frag의 파라미터 값을 1000~4000 사이로 1000단위로 입력해서 시도 해봤는데,


4000보다 낮을 때에는 segment 갯수가 이상하게 나왔다.


그런데 4000개 하니깐 잘나옴... 이유는 나중에 찾아봐야 겠다.



만들어진 mpd 파일과 segment들


제일 위의 mpd 파일과 화질별로, 오디오의 segment를 확인할 수 있었다.



실제 html에서 작동하는지 확인하자


<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.dashjs.org/latest/dash.all.min.js"></script>
</head>
<style>
video {
width: 640px;
height: 360px;
}
</style>
<body>
<div>
<video data-dashjs-player autoplay src="my/root/video.mpd" controls></video>
</div>
</body>
</html>


나는 dash player를 사용했다.(코드도 기본 dash 코드에서 가지고 왔다..)


잘 동작하면 성공!


어려운 작업은 하나도 없는데 매번 찾아보기가 귀찮다.. + ffmpeg 파라미터도 잘 모르니 외워지지도 않는다 ㅠ.ㅠ 기회가 되면 공부해봐야 겠다..!





출처 및 도움:

https://www.ffmpeg.org/

--> ffmpeg 사이트


http://cdn.dashjs.org/latest/jsdoc/index.html

-->mpd 재생을 위한 dash docs 나중에 api를 통해 ABR룰을 만들어봐야지..


https://bitmovin.com/mp4box-dash-content-generation-x264/

--> x.264로 만들기 귀찮아서 포기했다.. 더욱 쉬워보이긴 한다.


https://blog.desgrange.net/post/2017/04/17/encode-videos-dynamic-adaptive-streaming-http.html

--> 자꾸 keyint bad value 오류가 나오면서 되지 않는다 ㅠㅠ mp4box를 사용한다


https://developer.mozilla.org/en-US/docs/Web/HTML/DASH_Adaptive_Streaming_for_HTML_5_Video


http://halcyon.ch/dash-tutorial-1-getting-started-with-dash/

'연구 > 인코딩' 카테고리의 다른 글

HEVC Tile-based Adaptation  (1) 2020.05.26