ffmpeg를 사용하여 5.1을 스테레오로 올바르게 다운 믹스


27

왼쪽 앞과 오른쪽 앞에 음악이 있고 가운데에 대화가있는 영화의 5.1 오디오 트랙이 있습니다. VLC에서 5.1 트랙을 재생하면 모든 것이 잘 어울립니다.

을 사용하여 5.1 트랙을 스테레오로 변환하려고 ffmpeg -ac 2하지만 스테레오 믹스의 결과는 기본적으로 5.1 트랙을 재생하는 것보다 훨씬 약합니다.

추가 -af "pan=stereo|c0=FL|c1=FR"하면 올바른 음량이 나오지만 중앙 채널이 포함되어 있지 않으므로 대화가 없습니다.

그래서 해결책은 왼쪽 / 중앙 / 오른쪽을 스테레오로 믹스하고 백엔드 서브 우퍼 채널을 버리는 것일까 요? (여기서 추측하고 있습니다 ...)

그래서 질문은 : VLC와 같은 방식으로 ffmpeg 다운 믹스 5.1을 스테레오로 만드는 방법은 무엇입니까?


VLC가 실제로 추가 채널을 재생하고 있습니까? 다운 믹싱은 출력 채널당 각 입력의 합으로 과부하가 발생하지 않아 클리핑이 방지되도록 정규화 할 수 있습니다. 더 조용하게 들릴 수 있습니다.
llogan

기본 사항 : 내 파일은 5.1입니다. 내 스피커는 스테레오입니다. VLC가 무엇을하는지 모르지만 5.1 소스 데이터 (음악과 대화가 모두 포함 된 강력한 볼륨)에서 스테레오 스피커로 훌륭한 결과를 만들어냅니다. 반면에 ffmpeg는를 사용할 때 "낮은 볼륨"결과를 만듭니다 -ac 2. 그래서 ffmpeg가 VLC와 동일한 좋은 결과를 생성하는 방법을 묻습니다.
forthrin

답변:


29

Shane이 다른 채널과 센터를 너무 적게 제공하기 위해 제공 한 답변을 찾았습니다. 모든 대화와 배경 음악 / 효과가 충분하지 않은 헤드폰이있는 영화의 균형이 맞지 않습니다.

따르면 ATSC 표준 (섹션 7.8, 91 페이지)는 다음 식 (매트릭스 아닌) 종래의 스테레오 다운 믹스 5.1하는데 사용된다 :

Lo = 1.0 * L + clev * C + slev * Ls ;
Ro = 1.0 * R + clev * C + slev * Rs ;

위에서 언급 한 문서의 표 5.9 및 5.10에 따라 clev 및 slev는 .707이어야합니다. 중심 / 서라운드 믹스 레벨이 0이라고 가정합니다. 다른 값은 해당 테이블에 제공되어 있습니다. 유능한.

이 점을 염두에두고 다음 ffmpeg 옵션을 사용하면 음성 대화와 함께 균형 잡힌 사운드를 만들 수 있습니다. 오디오 채널을 지정할 필요는 없습니다.

-af "pan=stereo|FL < 1.0*FL + 0.707*FC + 0.707*BL|FR < 1.0*FR + 0.707*FC + 0.707*BR"

팬 필터 설명서 에서 미만 기호 사용에 대한 참고 사항 :

채널 스펙에서 '='가 '<'로 대체되면 해당 스펙의 게인이 다시 정규화되어 총계가 1이되어 클리핑 노이즈가 발생하지 않습니다.


5
여기에 연결 한 ATSC 표준 은 주제에 대한 FFmpeg Wiki 와 연결되어 있으므로 여기에 사용 된 공식이 ac -2스위치 와 함께 FFmpeg에 의해 구현 된 것과 동일하다는 것은 놀라운 일이 아닙니다 . 즉,이 필터를 사용하는 것과 수행하는 것의 유일한 차이점은 ac -2훨씬 더 타이핑하는 것입니다.
Hashim

@Hashim 타이핑뿐만 아니라 토대에 대한 철저한 설명이있는 대답은 "이것을 얻기 위해 이것을 타이핑하는 것"보다 객관적으로 낫습니다.
Sevastyan Savanyuk

18

이 질문에 대한 답변은 중복 정보를 포함하고 많은 사람들이 부정확 한 내용을 포함하여 약간 혼란스러워졌습니다. 이 답변은 문제의 해결을 위해 이러한 답변의 정보를 간소화하려는 시도입니다.

가장 중요한 것은 현재이 질문에 가장 많이 투표 된 그레고리 (Gregory)의 대답은 -ac 2스위치를 사용하는 것과 다르지 않다는 것 입니다.

5.1 채널 오디오 스트림을 스테레오로 다운 믹싱 -ac 2

FFmpeg에는 5.1 트랙을 스테레오로 다운 믹싱 할 수있는 기능이 내장되어 있으며 FFmpeg 자체 문서에서 권장 하는 솔루션이기도합니다 .

참고 : ffmpeg -ac는 매우 특정한 요구가없는 한 팬 필터보다 선호되는 기본 다운 믹스 (및 업 믹스) 시스템을 통합합니다 ( 옵션).

-ac 2스위치는 소스의 6 채널 스트림 (뒤 좌측, 후방 우측, 전방 좌측, 전방 우측 및 전방 중앙)에서 출력 스테레오 스트림의 전방 좌측 및 전방 우측 채널로 처음 5 개 채널의 비율을 혼합하여 작동합니다.

여기에 이미지 설명을 입력하십시오

LFE 채널의 그래서, 오디오 일 경우 ( 0.1 5.1은 우퍼 예약 깊은 저주파 효과를 사용)는 완전히 무시 이 옵션을 사용하는 경우.

불행히도, 내 테스트 -ac 2에서 소스와 가장 다른 음악과 대화의 전반적인 수준을 얻었으므로 테스트 한 모든 공식 중 최악의 결과를 제공하는 다운 믹스 공식으로 만들었습니다. 귀하의 요구에 맞는 완벽한 다운 믹스를 제공합니다.이 경우 다른 공식을 사용하면 과잉이 될 수 있습니다.


트랜스 코딩 -ac 2 없이 DTS 트랙을 다운 믹스하려면 (즉, 코덱과 확장명을 동일하게 유지) :

ffmpeg -i "sourcetrack.dts" -c:a dca -ac 2 "stereotrack.dts"

그의 답변에서 Mephisto가 지적했듯이 대화와 음악 사운드가 서로 균형이 잘 맞았지만 볼륨이 부족하면 스트림을 다운 믹스하면서 볼륨을 높일 수 있습니다.

ffmpeg -i "sourcetrack.dts" -c:a dca -ac 2 -vol 425 "stereotrack.dts"

들어 -vol스위치 소스 100 % 양의 정수 값 (256)이 오디오 스트림의 전체 부피를 증가보다 더 큰 값을 사용하는 것과 동일하다. 그러나 너무 많이하면 특히 큰 부분에 왜곡이나 아티팩트가 생길 수 있습니다.

스테레오 오디오 스트림을 다운 믹스하는 방법 예를 들어, AC3 코덱으로 트랜스 코딩 :

ffmpeg -i "sourcetrack.dts" -c:a ac3 -ac 2 "stereotrack.ac3"

맞춤형 믹스 알고리즘으로 5.1 채널 오디오 스트림을 스테레오로 다운 믹싱

보다 높은 품질의 다운 믹스를 원하거나 LFE 스트림을 출력에 반드시 포함시켜야하는 경우 FFmpeg의 오디오 필터 스위치 ( -af)를 사용하여 사용자 정의 믹스 공식을 사용하여 오디오를 다운 믹스 할 수 있습니다 .

ATSC 공식으로 다운 믹싱 (Gregory 's answer)

이 답변을 게시 할 당시이 질문에 대한 최고 투표 답변은 Gregory 's 였습니다.이 방법 은 ATSC 사양 (섹션 7.8.2, 두 채널로 다운 믹싱 참조 )을 FFmpeg 오디오 필터에 넣습니다. 이 사양 자체 는 주제에 대한 FFmpeg 문서와 직접 연결 되어있어 FFmpeg-ac 2스위치에 대해 이미 구현 한 것과 같은 공식 일 가능성이 높습니다 . 이것이 사실이라면, Gregory의 답변에 전체 수식을 입력하는 것이 -ac 2스위치를 사용하는 것과 다르지 않으므로 시간 낭비입니다.

나는 Gregory의 답변에서 필터 -ac 2-af필터를 사용하여 동일한 입력 오디오를 다시 인코딩하여이를 확실하게 테스트하기로 결정했습니다 (사용 된 정확한 명령은이 답변의 각주에서 볼 수 있습니다).

그런 다음 결과 출력 파일의 크기를 비교하여 바이트 단위의 동일한 크기라는 것을 알았습니다.

여기에 이미지 설명을 입력하십시오

마지막으로 Audacity에서 두 출력 파일을 모두 열고 파형을 비교하여 동일한 지 확인했습니다 (확대하려면 클릭).

여기에 이미지 설명을 입력하십시오

따라서 Gregory의 답변에 자세히 설명 된 ATSC 수식은 FFmpeg의해 이미 구현 된 것과 동일 하며 사용 -ac 2하지 않는 것이 없으면 훨씬 중복 되고 훨씬 성가신 명령 이라는 것은 상당히 결정적인 것으로 보입니다 .

LFE 채널을 버리지 않고 다운 믹싱 (Dave_750 's answer)

답변에 포함 된 몇 가지 중에서, 이것은 LFE 채널을 출력 스테레오에 완전히 버리지 않고 믹스하는 것으로 보이는 다운 믹스 공식 중 유일한 것이므로 결과적으로 소스에서 가장 적은 사운드를 보장하는 것은 잃어버린.

전체 음량 레벨은을 수행하는 것보다 높고 꽉 -ac 2찼지만 여전히 야간 모드 대화 다운 믹스보다 낮습니다. 그러나 음악 레벨은 Nightmode Dialogue 다운 믹스보다 소스에 훨씬 더 가깝고 LFE 트랙이 포함되어 있기 때문에이 다운 믹스 공식을 사용하는 동안 출력 볼륨을 높이면 다른 모든 것보다 5.1 소스에 더 정확한 사운드를 출력 할 수 있습니다 내가 테스트 한 공식.

이 기능이 있다면이 다운 믹스 공식과 Nightmode Dialogue 다운 믹스를 모두 사용하여 오디오 스트림을 인코딩하고 두 파형을 신중하게 비교하여 어느 것이 더 나은지 결정하는 것이 좋습니다.

이 식을 이용하여 스테레오 5.1 트랙 다운 믹스 (256 원본 소스의 볼륨 레벨의 100 % 임) (425)에 그것의 볼륨을 늘리

ffmpeg -i "sourcetrack.dts" -c dca -vol 425 -af "pan=stereo|FL=0.5*FC+0.707*FL+0.707*BL+0.5*LFE|FR=0.5*FC+0.707*FR+0.707*BR+0.5*LFE" "outputstereo.dts"

Robert Collier의 야간 모드 대화와의 다운 믹싱 (Shane Harrelson의 답변)

Doom9 포럼 에서 Robert Collier가 작성하고 Shane Harrelson이 그의 답변으로 제공 한 Nightmode Dialogue 공식 은 스위치 보다 다운 믹스가 훨씬 뛰어납니다. 지나치게 조용한 대화 대신, 출처.-ac 2

Robert Collier의 믹스 설명 :

eac3to를 사용하여 많은 DTS 영화 트랙을 5.1에서 2.0으로 변환 한 후, 기본 eac3to 채널 매핑이 매우 조용한 대화와 지나치게 큰 음악 및 액션 장면을 초래한다는 것을 알았습니다. eac3to 채널 다운 믹스 계수는 과학적 근거를 갖지만, 낮은 대화 볼륨 때문에 실제로는 잘 들리지 않습니다. 이 사전 설정은 왼쪽 및 오른쪽 채널 음악이 여전히 들리지만 백그라운드에서 더 많은 대화를 원하는 사람들을위한 것입니다.

보시다시피 프론트 센터 (대화방)는 이제 제대로 들어와 원래 수준으로 유지됩니다. 반면 음악과 폭발은 배경 효과로 남아 있고 당신을 압도하지 않습니다. 이 사전 설정은 대화를 들으려면 DTS 5.1을 2.0 영화로 변환 한 것을 볼 때 볼륨 노브를 계속 사용하는 문제를 해결합니다. (특히 밤에 다른 사람을 깨우지 않고 대화를 듣고 싶어하는 영화를 볼 때).

불행히도,이 다운 믹스 공식의 음악은 5.1 소스보다 훨씬 낮으며 (콜리어가 "야간 모드"믹스를 만들려는 의도를 고려하여 설계되었을 가능성이 높음) LFE 트랙의 완전한 손실로 인해 전체 출력 오디오가 그렇지 않습니다 부스트 음량 으로 Dave_750의 공식 같이 소스 전체에 가깝거나 가까운 사운드 .

그러나 어떤 이유로 스트림의 전체 볼륨을 높이 지 않으려면 야간 모드 대화가 최선의 선택 일 것입니다. 다시 오디오 스트림을 모두 인코딩하고 두 파형을 신중하게 비교하는 것이 좋습니다. .

FFmpeg에서 Nightmode Dialogue 공식과 다운 믹스하려면 :

ffmpeg -i "sourcetrack.dts" -c dca -af "pan=stereo|FL=FC+0.30*FL+0.30*BL|FR=FC+0.30*FR+0.30*BR" "stereotrack.dts" 

Tarc의 답변

이 답변은 Shane Harrelson의 답변에서 Nightmode Dialogue 다운 믹스 공식을 MKV 컨테이너의 오디오 스트림을 변환하는 명령에 넣습니다. 이 답변에 제공된 명령은 이러한 오디오 스트림에서 제대로 작동하지만 독립형 오디오 트랙에 맞게 조정하면 오류가 발생합니다.

필터링과 스트림 복사는 함께 사용할 수 없습니다

다운 믹싱 할 때 오디오 코덱 복사 될 수 없기 때문이다 - FFmpeg은이 출력 스트림으로 만드는 다른 변경과 같이 다운 믹스가 요구 변경을 적용 할 수 있도록 트랙을 재 부호화하는 것이.

이 명령에는 -ac 2FFmpeg가 무시한 중복 스위치 도 포함되었습니다 .


테스트 명령

이 답변에 대해 수행 한 테스트의 신뢰성을 보여주기 위해 각 다운 믹스 공식을 테스트하는 데 사용한 모든 명령이 아래에 나와 있습니다.

-ac 2옵션에 사용 된 테스트 명령 :

ffmpeg -i "signed16bitPCM.wav" -c pcm_s16le -ac 2 "Audio 1 (-ac 2).wav"

Gregory의 답변에 사용 된 테스트 명령 :

ffmpeg -i "signed16bitPCM.wav" -c pcm_s16le -af "pan=stereo|FL < 1.0*FL + 0.707*FC + 0.707*BL|FR < 1.0*FR + 0.707*FC + 0.707*BR" "Audio 2 (ATSC Algorithm Downmix).wav"

Dave_750의 답변에 사용 된 테스트 명령 :

ffmpeg -i "signed16bitPCM.wav" -c pcm_s16le -vol 425 -af "pan=stereo|FL=0.5*FC+0.707*FL+0.707*BL+0.5*LFE|FR=0.5*FC+0.707*FR+0.707*BR+0.5*LFE" "Audio 4 (Dave750 Downmix).wav"

Shane Harrelson의 답변에 사용 된 테스트 명령 :

ffmpeg -i "signed16bitPCM.wav" -c pcm_s16le -af "pan=stereo|FL=FC+0.30*FL+0.30*BL|FR=FC+0.30*FR+0.30*BR" "Audio 3 (Nightmode Dialogue Downmix).wav"

1
인상적인 통찰력! 시간을내어 공유해 주셔서 감사합니다. 이상하게도 -ac 2, 그로 인해 시작하기에 열등한 결과가 생겨 원래의 게시물이 표시되었습니다. 다시 시도하고 가능하면 내장 다운 믹스로 만족스러운 결과를 얻지 못하는 5.1 발췌 부분을 공유하십시오. 또한 트랜스 코딩없이 다운 믹스 할 수 있다는 것을 알고 매우 좋습니다!
forthrin

@forthrin 인코딩과 트랜스 코딩은 서로 다른 것임을 명심하십시오. 코드 변환은 한 코덱 / 확장에서 다른 코덱 / 확장으로 변환하고 인코딩은 동일한 코덱 / 확장으로 변환합니다. 코드 변환 없이는 트랜스 코딩없이 스트림에 다른 FFmpeg 효과를 다운 믹스하고 적용 할 수 있습니다. 이 ac -2옵션을 사용하면 모든 다운 믹스 공식 중 가장 열등한 결과를 얻을 수 있었으며 이것이 ATSC 표준 공식의 실패라고 생각합니다.
Hashim

나는 이것을 지금 시도했다. 그것은 것 같다 ffmpeg -i 5.1.mp4 -ac 2 2.mp4일을하지만, ffplay -i 5.1.mp4 -ac 2하지 않습니다.
forthrin

9

이 다운 믹스를 사용해보십시오.

-ac 2 -af "pan=stereo|FL=FC+0.30*FL+0.30*BL|FR=FC+0.30*FR+0.30*BR" 

Doom9 포럼에서 Robert Collier제안한 대로 .


2
모든 옵션은 무엇을 의미합니까? 설명하면 사람들이 복사하여 붙여 넣기 대신 다른 문제를 해결하기 위해 답변을 사용할 수 있습니다.
David Richerby

2
@DavidRicherby -ac = 오디오 채널 (스테레오의 경우 2), -af = 오디오 필터
Cestarian

3
5.1 영화에서 이것을 시도해 보았고 적어도 출력 스테레오는 나에게 완벽하게 들렸습니다. 명확한 대화와 다른 것들은 빠진 것 같지 않았습니다. VLC 지식이있는 사람이 기본 5.1에서 2.0 다운 믹스로 수행 한 작업을 정확하게 공유 할 수 있다면 좋을 것입니다.
forthrin

2
@DavidRicherby : 오디오 필터 (-af) 내부의 옵션은 다음과 같습니다. FL = Front-left; BL = 뒷좌석; FC = 프론트 센터; FR = 정면 오른쪽; BR = 오른쪽 뒤로. 플로트는 곱한 채널의 볼륨을 줄이거 나 (<1) 늘리거나 (> 1) 선형 요소입니다. FL = FC + 0.30 * FL + 0.30 * BL은 Front-left 채널을 Front-Center 채널로 설정하고 Front-left 채널의 30 %와 Back-left 채널의 30 %를 더한 값입니다.
kronenpj

1
FWIW :이 믹스로 인해 대화가 음악 및 주변 소리에 비해 너무 시끄 럽습니다. Tarc의 답변에 기술적으로 더 정확한 조합이 훨씬 더 즐겁습니다. 따라서 상황에 따라 가장 적합한 것을 시도해야 할 수도 있습니다.
jlh

3

따라서 @Shane Harrelson 's 와 @Jordan Harris의 답변을 다른 질문에 대한 답변 -게으른 모드를 켠 상태- input_51.mkv(5.1)을 output_stereo.mkv(stereo) 로 변환하는 데 필요한 사항은 다음과 같습니다.

ffmpeg -i input_51.mkv -c:v copy \
    -ac 2 -af "pan=stereo|FL=FC+0.30*FL+0.30*BL|FR=FC+0.30*FR+0.30*BR" \
    output_stereo.mkv

-c:v copy비디오 스트림이 접촉되지 않는 부분 수단 (I는 추측 V IDEO C odec 설정 되 경찰 IED). 그것 없이는 훨씬 오래 걸릴 것입니다. 완전성을 위해 위의 답변을 반복하면-ac 2 두 개의 오디오 채널을 의미 -af하며 오디오 필터를 지정합니다.

명령을 조금 살펴본 후, 두 개의 스테레오 채널이 구성되는 방식을 설정한다는 것을 알았습니다. FL(전면 좌측 채널) 원으로부터 촬영 FC(전면 중앙) 플러스 0.30*FL(30 % 전면 좌측)에서 플러스 0.30*BL등 (왼쪽 뒤쪽에서 30 %)과.


이것이 센터 채널을 일관되고들을 수있게 유지합니까?
Freedo

2

이것은 지금 오래된 질문이지만 올바른 방향으로 나를 지적하고 결과를 공유하고 싶었습니다.

-af "pan=stereo|FL=0.5*FC+0.707*FL+0.707*BL+0.5*LFE|FR=0.5*FC+0.707*FR+0.707*BR+0.5*LFE"

FC와 LFE의 절반을 왼쪽과 오른쪽에 넣으면 두 스피커에서 효과적인 음량으로 총 1이됩니다. .707 사용 * Front / Back Left / Right는 해당 채널을 적절한 수준으로 낮추어 센터를 압도하지 않습니다.


1

-ac 2 옵션이 음악이나 음성이 다른 구성 요소보다 너무 많이 들리지 않는 균형 잡힌 다운 믹스를 제공하는 경우 볼륨을 높여야합니다.

-vol 512

이 예제에서는 512를 사용했는데, 이로 인해 사운드가 두 배 더 커졌습니다. 규칙은 256이 100 %에 해당한다는 것입니다

값이 너무 높아지지 말고 폭발 또는 시끄러운 소음이있는 영화 부분에서 결과를 확인하십시오. 너무 높은 값을 사용하면 왜곡이 발생하기 쉽습니다.


1

-ac 2

다운 믹스의 채널 볼륨은 부동 소수점 코덱-> pcm_f32le, aac로 변경되지 않습니다.

다운 믹스의 볼륨 (LFE가없는 5.1 ~ 2.0)은 정수 코덱-> pcm_s16le, libfdk_aac를 사용하여 1 / 2.5 = -7.96dB 감소합니다.

영화는 한 방향으로 소리가 나고 모든 채널에서 최대 음압이 없습니다. 따라서 다운 믹스 볼륨을 줄이면 잘못된 수준의 압축이 올바른 방법입니다. 그것이 Dolby가하는 일입니다.


0

이 전체 페이지와 몇 가지 실험을 읽은 후 "down_mix"라는 스크립트를 만들었습니다.

#!/bin/bash -x

FL="0.5*FC + 0.707*FL + 0.707*BL + 0.5*LFE"
FR="0.5*FC + 0.707*FR + 0.707*BR + 0.5*LFE"
AUDIO_FMT="libopus"
CONTAINER="mkv"

ffmpeg -i "$1" -c:v copy -c:s copy \
    -c:a $AUDIO_FMT \
    -af "pan=stereo|FL=$FL|FR=$FR" \
    "${1%.*}"_dm.$CONTAINER

    # how to test a snippet of movie
    # -ss 41:07.0 -t 4 \

위의 변수를 원하는대로 조정하십시오. 나는 작은 볼륨에 문제가 없었으므로 그것을 제외하고 쉽게 추가했습니다.


0

ffmpeg 필터 "-ac 2"는 대상이 pcm_s16le로 인코딩되어 있으면 제대로 작동합니다. wav 형식으로 pcm_f32le로 인코딩하면 볼륨이 9dB 이상 증가합니다. 따라서 이런 경우에는 "-ac 2"필터를 사용하지 마십시오.


왜 음량이 증가합니까? 이것에 대해 어디서 배웠습니까?
forthrin

왜 그런지 모르겠다. 그러나 나는 매우 빈번한 ffmpeg 사용자입니다 (직접 컴파일). 5.1 (사이드) 소스를 가져 와서 "-ac 2"를 두 번 사용하여 pcm_s16le 및 pcm_f32le wav 파일로 변환하십시오. 두 wav 파일의 피크 볼륨을 비교하면 다음과 같은 내용을들을 수 있습니다.
Frank-Michael Fischer

이것은 예를 들어 ffmpeg 버전 N-93636-g6829c3c를 사용하여 발생합니다
Frank-Michael Fischer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.