Ffmpeg kullanarak 5.1'i stereoya düzgün şekilde karıştırın


27

Ön sol ve ön sağ müzik içeren, ortada diyalog içeren bir filmden 5.1 ses parçam var. VLC'de 5.1 parçanın çalınması her şeyi güzelce harmanlıyor.

5.1 parçayı stereo kullanarak dönüştürmeye çalışıyorum ffmpeg -ac 2, ancak elde edilen stereo karışımı 5.1 parçayı doğal olarak çalmaktan çok daha zayıf bir hacme sahip.

Eklemek -af "pan=stereo|c0=FL|c1=FR"doğru hacmi verir, ancak orta kanal dahil edilmediğinden diyalog yoktur.

Yani çözüm sol / orta / sağ stereo içine karıştırmak ve arka uç subwoofer kanallarını atmak olabilir? (Sanırım burada ...)

Yani soru şu: Ffmpeg downmix 5.1'i VLC'nin yaptığı gibi stereo hale nasıl getirebilirim ve sonuçta aynı güçlü hacim?


VLC'nin gerçekten ek kanalları oynadığından emin misiniz? Aşağı karıştırma, normalleştirme ile sonuçlanabilir, böylece çıkış kanalı başına her bir girişin toplamı aşırı yüklenmeye neden olmaz, böylece kırpma önlenir. Bu sesi daha sessiz yapabilir.
llogan

Temel bilgiler: Dosyam 5.1. Hoparlörlerim stereo. VLC'nin ne yaptığını bilmiyorum, ancak 5.1 kaynak verilerden (güçlü ses, hem müzik hem de diyalog dahil) stereo hoparlörlerimde harika bir sonuç yaratıyor. ffmpeg ise kullanırken "düşük hacimli" bir sonuç yaratır -ac 2. Bu yüzden nasıl ffmpeg VLC ile aynı iyi sonucu üretmek için soruyorum.
14th

Yanıtlar:


29

Shane'in diğer kanallardan ve merkezin çok azını sağlamak için verdiği cevabı buldum. Kulaklıklı filmler, tüm diyaloglarla ve yeterli arka plan müziği / efektleriyle dengeleniyordu.

ATSC standartlarına göre (bölüm 7.8, sayfa 91), aşağıdaki formül 5.1'i geleneksel stereoya (matrisin aksine) karıştırmak için kullanılır:

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

clev ve slev, yukarıda belirtilen belgede yer alan 5.9 ve 5.10 tablolarına göre 0707 olmalıdır. Merkez / surround karışım düzeyi 0 olarak kabul edilir. Bu tablolarda, bulamadığım orta karışım miktarını azaltan diğer değerler sağlanır işe yarar.

Bunu göz önünde bulundurarak, aşağıdaki ffmpeg seçeneği sesli diyalogla dengeli bir ses üretir. Ses kanallarını belirtmenin gerekli olmadığını unutmayın.

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

Kaydırma filtresi belgelerinden daha küçük olmayan sembolün kullanımı hakkında bir not :

Bir kanal spesifikasyonundaki '=', '<' ile değiştirilirse, o spesifikasyon için kazançlar, toplam 1 olacak şekilde yeniden düzenlenir, böylece kırpma gürültüsü önlenir.


5
Burada bağladığınız ATSC standartları konuyla ilgili FFmpeg wiki ile bağlantılıydı , bu yüzden burada kullanılan formülün FFmpeg tarafından ac -2anahtarı ile uygulananla aynı olması şaşırtıcı değildir . Başka bir deyişle, bu filtreyi kullanmakla yapmak arasındaki tek fark ac -2çok daha fazla yazmaktır.
Hashim

1
@Hashim Sadece yazmakla kalmaz. Desteklerin kapsamlı bir açıklaması olan bir cevap, objektif olarak "bunu elde etmek için yazın" dan daha iyidir.
Sevastyan Savanyuk

19

Bu sorunun yanıtları o zamandan beri, birçoğu gereksiz bilgiler içeren ve diğerleri tam yanlışlıklar içeren biraz karışıklık haline geldi. Bu cevap, bu cevaplardaki bilgileri, problemleri ortadan kaldırırken düzene sokma girişimidir.

En önemlisi, şu anda bu sorunun en çok oy alan cevabı olan Gregory'nin cevabının -ac 2anahtarı kullanmaktan farklı olmadığını akılda tutmak gerekir - daha fazlası aşağıda.

5.1 kanal ses akışını stereo ile aşağı karıştırma -ac 2

FFmpeg, 5.1 parçanın stereoya karıştırılması için yerleşik yeteneklerle birlikte gelir ve bu aynı zamanda FFmpeg'in kendi belgelerinin önerdiği çözümdür :

Not: ffmpeg -ac, çok özel gereksinimleriniz olmadıkça tava filtresi yerine tercih edilmesi gereken bir varsayılan aşağı karıştırma (ve yukarı karıştırma) sistemini entegre eder .

-ac 2Arka Sol, Arka Sağ, Ön Sol, Ön Sağ ve Ön Merkezi - - anahtarı kaynağın 6 kanallı akışından ilk 5 kanal oranlarda karıştırılmasıyla çalışır çıkış stereo akışının Ön Sol ve Ön Sağ kanallara:

resim açıklamasını buraya girin

Bunu yaparken, LFE kanalından gelen ses ( subwoofer için ayrılmış ve derin, düşük frekanslı efektler için kullanılan 5.1'deki .1 ) bu seçenek kullanıldığında tamamen atılır .

Ne yazık ki, testlerimde -ac 2, kaynaktan en farklı olan hem müzik hem de diyalogun genel seviyeleri ile sonuçlandı, bunu test edebildiğiniz ve bulabileceğinizi fark etmenize rağmen, test ettiğim tüm formüllerden en kötü çıktıyı veren downmix formülü haline geldi. ihtiyaçlarınız için mükemmel bir downmix sağlar, bu durumda başka bir formül kullanmak sizin için aşırıya kaçar.


İle DTS parçayı düşük uyarlamak için -ac 2 olmadan bunu transkodlamak (yani onun codec'i ve uzantısı aynı tutmak için):

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

Mephisto'nun cevabında belirtildiği gibi, diyalog ve müzik birbiriniz arasında iyi dengelenmiş, ancak sadece ses seviyesi düşükse, ses seviyesini arttırırken akışı karıştırabilirsiniz:

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

İçin -volanahtar, kaynağa% 100 hacim tamsayı değerine 256 ve bu ses akışının toplam hacmi artacak daha büyük bir değeri kullanılarak eşdeğerdir. Bununla birlikte, çok fazla yapmanın, özellikle daha yüksek bölümleri sırasında bozulmaya veya artefaktlara neden olabileceğini unutmayın.

Bir ses akışını stereoya karıştırmak ve AC3 kodekine kodlamak için, örneğin:

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

5.1 kanal ses akışını özel bir karma algoritmayla stereoya indirgeme

Daha yüksek kalitede bir downmix istiyorsanız veya çıkışınıza LFE akışını kesinlikle eklemeniz gerekiyorsa, -afözel bir karışım formülü kullanarak sesi karıştırmak için FFmpeg'in ses filtresi anahtarını ( ) kullanabilirsiniz.

ATSC formülü ile downmixing (Gregory'nin cevabı)

Bu cevabı gönderirken, bu sorunun en çok oylanan yanıtı , formülü ATSC spesifikasyonundan (bkz. Bölüm 7.8.2, İki Kanala Aşağı Karıştırma ) bir FFmpeg ses filtresine yerleştiren Gregory'nin idi . Bu belirtimin kendisi doğrudan konuyla ilgili FFmpeg belgeleriyle bağlantılıdır, bu da FFmpeg'in anahtarı için zaten uyguladığı formülün büyük olasılıkla olduğunu gösterir . Bu doğruysa, tüm formülü Gregory'nin cevabına yazmak, anahtarı kullanmaktan ve dolayısıyla zaman kaybından farklı olmaz .-ac 2-ac 2

Bunu, her ikisini -ac 2ve -afGregory'nin cevabındaki filtreyi kullanarak aynı giriş sesini yeniden kodlayarak kesin olarak test etmeye karar verdim (kullanılan komutlar, bu cevabın dipnotlarında görülebilir).

Daha sonra elde edilen çıktı dosyalarının boyutlarını karşılaştırdım ve bayt-byte-byte için aynı boyutta olduklarını gördüm:

resim açıklamasını buraya girin

Son olarak, iki çıktı dosyasının her ikisini de Audacity'de açtım ve aynı olduklarını doğrulamak için dalga formlarını karşılaştırdım (büyütmek için tıklayın):

resim açıklamasını buraya girin

Bu nedenle Gregory'nin cevabında detaylandırılan ATSC formülünün FFmpeg tarafından halihazırda uygulanmış olduğu ile aynı olduğu ve bunu yapmayan -ac 2ve çok daha hantal bir komut olduğu zaman onu kullanmanın tamamen gereksiz olduğu son derece net görünüyor .

LFE kanalını atmadan küçültme (Dave_750'nin cevabı)

Cevaplarda yer alan birkaç kişiden, bu, LFE kanalını tamamen atmak yerine çıkış stereouna karıştırdığı görülen ve sonuçta kaynaktan en az sesi sağlayan tek downmix formüllerinden biridir. kayıp.

Genel ses seviyesi yapmaktan daha yüksek ve dolgun -ac 2, ancak yine de aşağıdaki Gece Modu Diyaloğu downmix'inden daha düşük. Bununla birlikte, müzik seviyeleri kaynağa Nightmode Dialogue downmix'ten çok daha yakındır ve LFE parçasının dahil edilmesi nedeniyle, bu downmix formülünü kullanırken çıktının ses seviyesini artırmak, 5.1 kaynağına diğerlerinden daha doğru ses veren bir çıkış akışı oluşturabilir test ettiğim formüller.

Bu yeteneğe sahipseniz, hem bu downmix formülünü hem de Nightmode Dialogue downmixini kullanarak ses akışlarınızı kodlamanızı ve hangisinin daha iyi olduğunu belirlemek için iki dalga formunu dikkatlice karşılaştırmanızı şiddetle tavsiye ederim.

5.1 formunu stereoya bu formülü kullanarak karıştırmak ve ses seviyesini 425'e yükseltmek için (burada 256, orijinal kaynağın ses seviyesinin% 100'üdür):

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'in Nightmode Dialogue ile downmixing (Shane Harrelson'ın cevabı)

Robert Collier tarafından Doom9 forumunda oluşturulan ve yanıtında Shane Harrelson tarafından sağlanan Nightmode Dialogue formülü, anahtardan çok daha iyi bir downmix ile sonuçlanıyor -ac 2- aşırı sessiz diyaloglar yerine, onları çok daha yakın seviyelere geri getiriyor. kaynak.

Robert Collier'in karışımın açıklamasından:

Birçok DTS film parçasını eac3to kullanarak 5.1'den 2.0'a dönüştürdükten sonra, çok sessiz diyaloglar ve aşırı yüksek sesli müzik ve aksiyon sahneleri için varsayılan eac3to kanal eşlemelerini buldum. Her ne kadar eac3to kanalı downmix katsayıları bilimsel bir temele sahip olsa da, düşük diyalog hacminden dolayı pratikte genellikle iyi görünmemektedir. Bu ön ayar, sol ve sağ kanal müziği hala duyulabilir, ancak arka planda daha fazla olan net diyaloglar arayanlar içindir.

Gördüğünüz gibi - ön merkez (diyaloglar) şimdi düzgün bir şekilde geliyor ve orijinal seviyesinde kalıyor - müzik ve patlamalar arka plan efekti olarak kalıyor ve sizi aşırı etkilemiyor. Bu ön ayar, diyalogları duymak için 2.0 filme dönüştürülen DTS 5.1'i izlerken ses seviyesi düğmesiyle sürekli uğraşmanız sorununu çözer. (Özellikle geceleri başkalarını uyandırmak istemediğiniz, ancak yine de diyalogları duymak istediğiniz filmleri izlemek için).

Ne yazık ki, bu downmix formülünün müziği 5.1 kaynağından çok daha düşüktür (Collier'ın bir "gece modu" karışımı oluşturma niyeti göz önünde bulundurularak tasarlandı) ve LFE parçasının tamamen kaybedilmesi nedeniyle, genel çıkış sesi ses düzeyi Dave_750'nin artırılmış hacimli formülü kadar dolu veya kaynağa yakın .

Bununla birlikte, herhangi bir nedenden dolayı akışın genel hacmini artırmaktan kaçınmak istiyorsanız, Nightmode Dialogue muhtemelen en iyi seçenek olacaktır - yine de, ses akışınızı ikisine de kodlamanızı ve ikisinin dalga formlarını dikkatlice karşılaştırmanızı şiddetle tavsiye ederim. .

FFmpeg'deki Nightmode Dialogue formülüyle karıştırmak için:

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'ın cevabı

Bu cevap, Shane Harrelson'ın cevabından gelen Nightmode Dialogue downmix formülünü basitçe bir MKV kapsayıcısındaki ses akışını dönüştürme komutuna koyar. Bu cevapta verilen komut böyle bir ses akışında iyi çalışır, ancak bağımsız bir ses parçası için uyarlanması hatayı verir:

Filtreleme ve akış kopyası birlikte kullanılamaz

Bunun nedeni, aşağı karıştırma sırasında ses kodekinin kopyalanamamasıdır - FFmpeg'in diğer tüm değişiklikler bir çıkış akışında yaptığı gibi, bir downmix , değişikliklerin uygulanması için parçanın yeniden kodlanmasını gerektirir .

Bu komut ayrıca -ac 2FFmpeg'in yok saydığı bir yedek anahtarı da içeriyordu .


Test komutları

Bu cevap için yaptığım testlerin güvenilirliğini göstermek için, her downmix formülünü test etmek için kullandığım tüm komutlar aşağıdadır.

-ac 2Seçenek için kullanılan test komutu :

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

Gregory'nin cevabı için kullanılan test komutu:

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'nin cevabı için kullanılan test komutu:

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'un cevabı için kullanılan test komutu:

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
Etkileyici içgörü! Bunu paylaşmak üzere zaman ayırdığınız için teşekkür ederiz. O zaman garip, bu -ac 2bana başlamak için daha düşük bir sonuç verdi, bu da orijinal gönderimi yönlendirdi. Bunu tekrar deneyeceğim ve mümkünse, dahili downmix ile tatmin edici bir sonuç vermeyen 5.1 bir alıntıyı paylaşacağım. Ayrıca kod dönüştürmeden aşağı karıştırabileceğinizi bilmek çok güzel!
forthrin

@forthrin Kodlamanın ve kod dönüştürmenin iki farklı şey olduğunu unutmayın. Kod dönüştürme bir kodek / uzantıdan diğerine dönüştürülür ve kodlama aynı kodek / uzantıya dönüştürülür. Kod dönüştürmeden bir akışa diğer FFmpeg efektlerini karıştırabilir ve uygulayabilirsiniz, ancak kodlama yapamazsınız. Bu ac -2seçenek bana tüm downmix formüllerinin en düşük sonucunu verdi, bence bu sadece ATSC standardının formülünde bir başarısızlık.
Hashim

Bunu şimdi denedim. Görünüşe göre ffmpeg -i 5.1.mp4 -ac 2 2.mp4işe yarıyor ama ffplay -i 5.1.mp4 -ac 2çalışmıyor.
19th

9

Bu downmix'i deneyin:

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

Doom9 forumunda Robert Collier tarafından önerildiği gibi .


2
Tüm bu seçenekler ne anlama geliyor? Onları açıklarsanız, insanlar yanıtınızı sadece kopya yapıştırmak yerine farklı sorunları çözmek için kullanabilirler.
David Richerby

2
@DavidRicherby -ac = Ses Kanalları (stereo için 2),
-af

3
Bunu 5.1 film için denedim ve en azından çıkış stereosu bana tamamen iyi geldi. Net diyalog ve başka hiçbir şey eksik görünmüyordu. VLC bilgisine sahip bir kişi, varsayılan 5.1 ila 2.0 downmix'te yapılanları tam olarak paylaşabilirse harika olurdu.
forthrin

2
@DavidRicherby: Ses filtresindeki (-af) seçenekler şunlardır: FL = Ön-sol; BL Arka sol =; FC Ön merkezi =; FR = Ön sağ; BR = Arka sağ. Şamandıralar çarpılan kanalın hacmini azaltmak (<1) veya arttırmak (> 1) için doğrusal faktörlerdir. FL = FC + 0.30 * FL + 0.30 * BL, Ön-Sol kanalı Ön-Orta kanala artı Ön-Sol kanalının% 30'una ve Sol-sol kanalların% 30'una ayarlıyor.
kronenpj

1
FWIW: Bu karışımın diyalogları müzik ve ortam seslerine göre çok yüksek hale getirdiğini düşünüyorum. Tarc'ın cevabında verilen teknik olarak daha doğru karışım benim için çok daha hoş. Sanırım sizin için en iyi olanı denemeniz gerekebilir, bu duruma bağlıdır.
jlh

4

Yani, @Shane Harrelson'u @Jordan Harris'in başka bir soruya vereceği cevabı birleştirerek - tembel mod açıkken - burada input_51.mkv(5.1) 'i output_stereo.mkv(stereo)' ya dönüştürmek için gerekenler :

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 copyVideo akışı dokunulduğunu olmadığı bölüm (i tahmin bu v ideo C odec ayarları ediliyor polis ied). Onsuz, çok daha uzun sürecek. Tamlık için yukarıdaki cevaptan tekrarlamak, -ac 2iki ses kanalı anlamına gelir ve -afbir ses filtresi belirtir.

Komuta biraz baktıktan sonra, iki stereo kanalın nasıl oluşturulduğunu ayarladım; FL(ön sol kanal) orijinal alınır FC(ön merkezi) artı 0.30*FL(% 30, ön soldan) artı 0.30*BLböylece (sol arkasından,% 30) ve.


Bu, merkez kanalı tutarlı ve sesli tutacak mı?
Freedo

2

Bu şimdi eski bir soru, ama bana doğru yönü gösterdi ve sonucumu paylaşmak istedim:

-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 ve LFE'nin yarısını sola ve sağa koymak, her iki hoparlörden de etkili ses seviyeleri için toplam 1 verir. .707 * Ön / Arka Sol / Sağ kullanımı bu kanalları iyi bir seviyeye getirir, böylece merkeze aşırı güç vermezler.


1

-Ac 2 seçeneği size ne müziğin ne de konuşmanın diğer bileşenlerden çok daha fazla ses vermediği dengeli bir downmix veriyorsa, ses seviyesini yükseltmeniz yeterlidir.

-vol 512

Örnekte 512 kullandım, bu da sesi iki kat daha yüksek hale getirdi. Kural 256'nın% 100'e eşdeğer olmasıdır

Değeri çok yükseğe çıkarmayın ve filmin bu bölümlerindeki sonuçları patlamalar veya yüksek sesle kontrol ettiğinizden emin olun. Çok yüksek bir değer kullanarak distorsiyon sağlamak çok kolaydır.


0

Bu sayfanın tamamını ve bazı denemeleri okuduktan sonra "down_mix" adlı bir senaryo buldum:

#!/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 \

Yukarıdaki değişkenleri beğeninize göre değiştirin. Düşük sesle ilgili bir sorunum yoktu, bu yüzden bunu bıraktım, ancak kolayca eklendi.


0

"-Ac 2" ffmpeg filtresi, hedefiniz pcm_s16le kodlu olduğu sürece iyi çalışır. Wav formatında pcm_f32le kodlarken ses seviyesi 9dB ve daha fazla artar. Bu nedenle: "-ac 2" filtresini bu gibi durumlarda kullanmayın.


1
Hacim neden artıyor? Bunu nereden öğrendin?
forthrin

Hiçbir fikrim yok, neden. Ama ben çok sık bir ffmpeg kullanıcı (kendim derleme). Herhangi bir 5.1 (yan) kaynağı alın ve her iki kez de "-ac 2" kullanarak pcm_s16le ve pcm_f32le wav dosyasına dönüştürün. İki wav dosyasının zirve hacimlerini karşılaştırın ve göreceksiniz (ve duyacaksınız):
Frank-Michael Fischer

Bu, örneğin ffmpeg N-93636-g6829c3c sürümünü kullanıyor
Frank-Michael Fischer

0

-ac 2

Downmix'teki kanalların hacmi kayan nokta codec'i ile değişmiyor -> pcm_f32le, aac

Downmixteki hacim (LFE olmadan 5.1 ila 2.0) tamsayı codec'i ile 1 / 2.5 = -7.96 dB azalır -> pcm_s16le, libfdk_aac

Filmlerin sesi bir yönde işaretlidir ve tüm kanallarda maksimum ses basıncı yoktur. Bu nedenle azaltılmış downmix hacmi yanlış, küçük seviye sıkıştırma doğru yol. Dolby bunu yapar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.