
ffmpeg를 사용하여 입력 비디오에 대해 다중 다중화/재인코딩/복사 작업을 수행하려고 하는데 시도한 방법으로 인해 장애물이 발생했습니다. 테스트를 계속하기 전에 이것이 실제로 소프트웨어로 가능한지 확인하고 싶습니다. (이것은 내 LAN에 있는 다른 PC에서 하나의 라이브 스트림을 가져와 여러 RTMP 대상으로 보관/재스트리밍하는 라이브 스트리밍 설정을 위한 것이므로 플래그가 지정되고 -re
한 번의 작업으로 모든 작업을 수행해야 합니다.)
입력 비디오에는 높은 비트 전송률의 h.264 비디오 스트림 1개와 PCM 오디오 트랙 4개가 있습니다.
필요한 세 가지 출력은 다음과 같습니다.
- 8Mbps에서 h.246 인코딩 1개, 오디오 트랙 1만 aac 인코딩
- 12Mbps에서 하나의 h.264 인코딩, 오디오 트랙 1의 aac 인코딩(이상적으로는 첫 번째 출력과 동일한 인코딩 사용, 즉 오디오를 한 번만 인코딩하면 됨)
- .mkv에 대한 전체 입력의 하나의 순수 스트림 복사본
(이 명령은 오류와 나쁜 관행으로 가득 차 있을 수 있으며, 단지 내가 가고 있는 방향에 대한 일반적인 아이디어일 뿐입니다.)
나는 이 라인을 따라 먹서 와 함께 split
/ 필터를 사용해 보았습니다 . 필터를 사용하면 스트림 복사/코덱 패스스루가 허용되지 않는다는 점을 제외하면 이론상으로는 작동할 것 같습니다(아이러니하게도 이 경우 비디오 스트림에 실제 필터링이 수행되지 않습니다. 통과하는 것 외에).asplit
tee
ffmpeg -re -init_hw_device qsv=hw -filter_hw_device hw -hwaccel qsv -hwaccel_output_format qsv -c:v h264_qsv -i $INPUT \
-filter_complex "[0:v]split=3[twitch][youtube][passv];[0:a]asplit[stream][passa]" \
-map:v "[twitch]" -map:v "[youtube]" -map:v "[passv]" -map:a "[stream]:0" -map:a "[passa]" \
-c:v:0 h264_qsv -profile:v:0 high -preset:v:0 medium -g 120 -b:v:0 8M -maxrate:v:0 8M -bufsize:v:0 4M \
-c:v:1 h264_qsv -profile:v:1 high -preset:v:0 medium -g 120 -b:v:1 12M -maxrate:v:1 12M -bufsize:v:1 6M \
-c:v:2 copy \
-c:a:0 aac -b:a:0 320k \
-c:a:1 copy \
-f tee "[select=\'v:0,a:0\']8mbps.mkv|[select=\'v:1,a:0\']12mbps.mkv|[select=\'v:2,a:1\']copy.mkv"
나는 또한 여러 출력에 대한 간단한 스트림 매핑을 가지고 놀았지만 실제로는 각각 하나의 비디오 및 오디오 출력만 처리하는 것처럼 보이며 스트림 매핑이 이런 방식으로 사용될 수 있는지 확실하지 않으므로 이 방법은 엉망일 가능성이 높습니다.
ffmpeg -re -init_hw_device qsv=hw -filter_hw_device hw -hwaccel qsv -hwaccel_output_format qsv -c:v h264_qsv -i $INPUT \
-map 0:0 -c h264_qsv -profile high -preset medium -g 120 -b 8M -maxrate 8M -bufsize 4M \
-map 0:0 -c h264_qsv -profile high -preset medium -g 120 -b 12M -maxrate 12M -bufsize 6M \
-map 0:1 -c aac -b 320k \
-map 0:a -c copy \
-f tee "[select=\'v:0,a:0\']8mbps.mkv|[select=\'v:1,a:1\']12mbps.mkv|[select=\'v:2,a:1\']copy.mkv"
상황을 더욱 복잡하게 만들기 위해 여기에서는 Quick Sync 하드웨어 인코딩을 사용하고 있으며 가능하면 각 재인코딩에 적용하고 싶었지만 -vf hwupload=extra_hw_frames=64,format=qsv
초기 테스트에서는 서로 다른 인코딩에서도 두 세트의 필터가 가능한지 확실하지 않았습니다.
어쨌든 ffmpeg로도 이것이 가능합니까? 그렇다면 어떻게 될까요?
답변1
우리는 사용할 수 있습니다티 디먹서인코딩된 aac 오디오를 재사용하기 위해스트림 매핑, 그리고스트림 지정자:
ffmpeg -y -c:v h264_qsv -i in.mkv -map 0:v -map 0:v -map 0:a -c:v:0 h264_qsv -profile:v:0 high -preset:v:0 medium -g 120 -b:v:0 8M -minrate:v:0 8M -maxrate:v:0 8M -c:v:1 h264_qsv -profile:v:1 high -preset:v:1 medium -g 120 -b:v:1 12M -minrate:v:1 12M -maxrate:v:1 12M -c:a:0 aac -b:a:0 320k -f tee "[select=\'v:0,a\']8mbps.mkv|[select=\'v:1,a\']12mbps.mkv" -map 0 -c copy copy.mkv
-re
필요에 따라 입력과 출력을 추가 하고 교체합니다.
-c:v h264_qsv
- QSV H.264 하드웨어 가속 디코딩을 적용합니다(또한 사용할 수도 있음-hwaccel qsv
).-map 0:v -map 0:v -map 0:a
- 입력 비디오 스트림을 "첫 번째"(0
) 및 "두 번째"(1
) 출력 비디오 스트림에 매핑합니다(그리고 오디오 스트림을 매핑합니다).-c:v:0 h264_qsv -profile:v:0 high -preset:v:0 medium -g 120 -b:v:0 8M -minrate:v:0 8M -maxrate:v:0 8M
-h264_qsv
출력 비디오 스트림을 적용하는 모든 매개변수와 함께 비디오 인코더를 선택합니다0
.-c:v:1 h264_qsv -profile:v:1 high -preset:v:1 medium -g 120 -b:v:1 12M -minrate:v:1 12M -maxrate:v:1 12M
-h264_qsv
출력 비디오 스트림을 적용하는 모든 매개변수와 함께 비디오 인코더를 선택합니다1
.-c:a:0 aac -b:a:0 320k
- 오디오 인코더와 비트 전송률을 선택합니다.-f tee "[select=\'v:0,a\']8mbps.mkv|[select=\'v:1,a\']12mbps.mkv"
- 두 개의 서로 다른 비디오 스트림을 사용하여 동일한 인코딩된 오디오 스트림을 "다중화"합니다.
첫 번째 출력 비디오 스트림( )은 출력 파일0
로 "다중화"됩니다 . 두 번째 출력 비디오 스트림( )은 출력 파일 로 "다중화"됩니다 .8mbps.mkv
1
12mbps.mkv
-map 0 -c copy copy.mkv
- 두 번째 출력을 적용합니다(첫 번째 출력 이후에 나오므로).
-map 0
- 입력에서 출력까지 모든 입력 스트림을 매핑합니다.
-c copy
- 다시 인코딩하지 않고 모든 입력 스트림을 복사합니다.
테스트를 위해 합성 비디오 파일을 만들었습니다 in.mkv
.
ffmpeg -y -f lavfi -i mandelbrot=size=1920x1080:rate=30 -f lavfi -i sine=frequency=400 -c:v libx264 -strict -2 -c:a dca -ar 44100 -pix_fmt yuv420p -t 5 in.mkv
노트:
-b:v:0 4M -minrate:v:0 4M -maxrate:v:0 4M
일정한 비트 전송률을 적용합니다(정말 필요한지 잘 모르겠습니다).bufsize
인수가 인코더와 작동하지 않습니다h264_qsv
(이 문제를 해결하려고 시도하지 않았습니다).