GPU서버에서 FFMPEG로 동영상 인코딩

| 2020년 5월 20일 | 0 Comments

FFmpeg 명령어의 기본 사용

# ffmpeg -y -hwaccel cuda -i input.mp4 -gpu 0 -vf scale=2560:1440 -c:v h264_nvenc -b:v 2000k -b:a 2000k output.mp4

-hwaccel cuda                               cuda 사용하여 디코딩

-i input.mp4                                  인코딩하려는 원본 파일

-gpu 0                                            해당 그래픽카드 선택

-vf scale=2560:1440                     동영상 해상도 입력

-c:v h264_nvenc                            h264_nvenc방식을 사용하여 인코딩(GPU사용)

-b:v 2000k                                     비디오 비트레이트를 지정 

-b:a 2000k                                     오디오 비트레이트를 지정

-vf scale=1280:720 s 1280*720는 같은 효과를 낸다.

 

 

FFmpeg로 워터마크 추가

워터마크 추가

# ffmpeg -i input.mp4 -i watermark.png -filter_complex “[1:v][0:v]scale2ref=(30/30)*ih/8/sar:ih/8[wm][base];[base][wm]overlay=10:10” -pix_fmt yuv420p -c:v h264_nvenc output.mp4

30/30 (W / H)    동영상해상도에 자동적으로 1/8로 워터마크를 추가합니다.

워터마크 추가 위치 (10:10 를 원하는 위치로 교체해주면 됩니다.)

10:10                                                                   워터마크 추가위치 왼쪽 상단 코너

10:main_h-overlay_h-10                                    워터마크 추가위치 왼쪽 하단 코너

main_w-overlay_w-10:10                                  워터마크 추가위치 오른쪽 상단 코너

main_w-overlay_w-10 :main_h-overlay_h-10  워터마크 추가위치 오른쪽 하단 코너

 

워터마크 추가하고 HLS로 전환할 경우 

# ffmpeg -i input.mp4 -i watermakr.png -c:v h264_nvenc -c:a aac -s 480×360 -filter_complex “[1:v][0:v]scale2ref=(160/160)*ih/8/sar:ih/8[wm][base];[base][wm]overlay=10:10” -f hls -hls_list_size 0 -hls_time 60 -hls_segment_filename file%01d.ts output.m3u8

-s 480×360              동영상 해상도를 전환하는 동시 워터마크 추가  

 

 

FFmpeg로 동영상 분할,인코딩 & 합치기 

동영상 분할 및 인코딩

# ffmpeg -ss 0 -accurate_seek -i input.mp4 -t 60 -vf scale=-1:720 -gpu 1 -c:v h264_nvenc -c:a copy out1.mp4

# ffmpeg -ss 60 -accurate_seek -i input.mp4 -t 60 -vf scale=-1:720 -gpu 2 -c:v h264_nvenc -c:a copy out2.mp4

# vim /home/user/list.txt                           # list.txt에 동영상 리스트를 추가합니다.

file /home/user/output-1.mp4

file /home/user/output-2.mp4

동영상 합치기

# ffmpeg -f concat -i /home/user/list.txt -c:v copy -c:a copy Output.mp4 -y

 

 

FFmpeg로 동영상 분할 및 HLS로 전환하여 합치기 

분할 과정 :

순서 :

분할 및 인코딩이 완성된 동영상들을 전송 받아 한개의 완전한 동영상으로 합칩니다. 이때 동영상은 원본 동영상의 오디오스트리밍이 포함되지 않습니다.

새로 합친 완전한 동영상과 원본 동영상의 오디오스트리밍을 합치는 동시에 HLS 로 전환해줍니다.

동영상 분할 및 인코딩

# ffmpeg -ss 0 -accurate_seek -i video.mp4 -t 60 -map 0 -map -0:a -gpu 0 -c:v h264_nvenc -vf scale=-1:720 video-1.mp4 -y

-ss 0 -t 60                                         동영상 0초부터 + 60(0~60)

-map 0                                              -i 로 시작한 첫번째 파일(video.mp4 )

-map -0:a                                          -i 로 시작한 첫번째 파일에서 오디오 제거

-gpu 0                                               첫번째 GPU로 인코딩 (0부터 시작)

scale=-1:720                                     해상도 높이 720 길이 자동으로 인코딩

 

워터마크 추가할 경우 (워터마크 추가 + 분할 + 인코딩)

# ffmpeg -ss 0 -accurate_seek -i input.mp4 -i logo.png -t 60 -map 0 -map -0:a -gpu 0 -c:v h264_nvenc -filter_complex “[0:v]scale=-1:720[Video];[1:v][Video]scale2ref=oh*mdar:ih/30[wm][base];[base][wm]overlay=24:24” video-1.mp4 -y

-ss 0 -t                                               60 동영상 0초부터 + 60(0~60)

-map 0                                              -i 로 시작한 첫번째 파일(video.mp4 )

-map -0:a                                          -i 로 시작한 첫번째 파일에서 오디오 제거

-i logo.png                                        추가할 워터마크 파일

24:24                                                워터마크 파일 추가위치 왼쪽 상단 코너

24:main_h-overlay_h-24                  워터마크 파일 추가위치 왼쪽 하단 코너

main_w-overlay_w-24:24                워터마크 파일 추가위치 오른쪽 상단 코너

main_w-overlay_w-24 :main_h-overlay_h-24    워터마크 추가위치 오른쪽 하단 코너

(해상도 마다 overlay 수치가 다릅니다. )

360P overlay=1212
480P overlay=16
16
720P overlay=24
24
1080P overlay=48
48

 

동영상 합치기

# ffmpeg -f concat -i /www/list.txt -c copy video-new.mp4

# cat /www/list.txt //list.txt 파일 보기

file video-1.mp4 //동영상 파일은 절대경로를 사용합니다.

file video-2.mp4

 

원본 파일의 오디오 추가 및 HLS 로 전환

# ffmpeg -y -i video-new.mp4 -i video.mp4 -map 0 -map 1:a? -c copy -f hls -hls_list_size 0 -hls_time 30 -hls_segment_filename ‘file%03d.ts’ output.m3u8

video-new.mp4                           새로 합친후의 오디오스티리밍이 없는 영상

video.mp4                                   원본 동영상 파일

-map 0                                         첫번째 -i 의 파일 video-new.mp4

-map 1:a?                                    두번째 -i의 파일video.mp4 오디오스트리밍만 추출

오디오가 포함되여 있지 않을시 에러 생기지 않습니다.

-hls_list_size 0                             모든 정보를 저장합니다.

-hls_time 30                                30초 간격으로 ts 파일을 생성합니다.

-hls_segment_filename              ts파일명을 지정하여 줍니다. (‘%03d’ 숫자001,002)

output.m3u8                              m3u8명을 지정하여 줍니다.

 

 

 

GPU서버에서 그래픽카드 정보 및 사용 프로세스 확인 

# nvidia-smi

위의 서버에서 GPU4개이고 gpu 0, gpu 1,gpu 2,gpu3 등등 숫자 0 으로 시작됩니다. 선택할때엔 해당 그래픽카드 숫자를 입력하면 됩니다.

 

Category: 동영상/CDN

Avatar

About the Author ()