Downmix 5.1 ke stereo menggunakan ffmpeg


27

Saya memiliki trek audio 5,1 dari sebuah film di mana kiri depan dan kanan depan berisi musik, dan pusat berisi dialog. Memainkan trek 5.1 di VLC memadukan semuanya dengan baik.

Saya mencoba mengubah trek 5.1 menjadi menggunakan stereo ffmpeg -ac 2, namun campuran stereo yang dihasilkan memiliki volume yang jauh lebih lemah daripada memutar lagu 5.1 secara asli.

Menambahkan -af "pan=stereo|c0=FL|c1=FR"memberikan volume yang benar, tetapi kemudian tidak ada dialog karena saluran tengah tidak termasuk.

Jadi solusinya mungkin untuk mencampur kiri / tengah / kanan ke stereo, dan membuang saluran subwoofer belakang? (Saya menduga di sini ...)

Jadi pertanyaannya adalah: Bagaimana cara saya membuat ffmpeg downmix 5.1 menjadi stereo dengan cara yang sama seperti VLC, dengan volume kuat yang sama pada hasil akhirnya?


Apakah Anda yakin VLC sebenarnya memutar saluran tambahan? Downmixing dapat menghasilkan normalisasi sehingga jumlah setiap input per saluran output tidak menghasilkan kelebihan sehingga kliping dicegah. Ini bisa membuatnya terdengar lebih tenang.
llogan

Dasar-dasar: File saya adalah 5.1. Speaker saya stereo. Saya tidak tahu apa yang VLC lakukan, tetapi itu menciptakan hasil akhir yang hebat pada speaker stereo saya dari data sumber 5.1 (volume yang kuat, termasuk musik dan dialog). ffmpeg, di sisi lain, menciptakan hasil "volume rendah" saat menggunakan -ac 2. Jadi saya bertanya bagaimana membuat ffmpeg menghasilkan hasil yang sama baiknya dengan VLC.
sebagainyarin

Jawaban:


28

Saya menemukan jawaban yang diberikan Shane untuk menyediakan terlalu sedikit saluran lain dan terlalu banyak pusat. Film dengan headphone terdengar tidak seimbang, dengan semua dialog dan tidak cukup musik latar / efek.

Menurut standar ATSC (bagian 7.8, halaman 91), rumus berikut ini digunakan untuk meng-downmix 5.1 ke stereo konvensional (sebagai lawan dari matriks):

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

clev dan slev harus 0,707, sesuai dengan tabel 5.9 dan 5.10 dalam dokumen yang disebutkan di atas, dengan asumsi tingkat campuran pusat / surround 0. Nilai-nilai lain disediakan dalam tabel-tabel yang mengurangi jumlah campuran pusat, yang saya tidak menemukan berguna.

Dengan mengingat hal ini, opsi ffmpeg berikut menghasilkan suara seimbang yang baik dengan dialog yang terdengar. Perhatikan bahwa menentukan saluran audio tidak perlu.

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

Catatan tentang penggunaan simbol kurang dari, dari dokumentasi saringan panci :

Jika '=' dalam spesifikasi saluran diganti dengan '<', maka keuntungan untuk spesifikasi tersebut akan dinormalisasi ulang sehingga totalnya adalah 1, sehingga menghindari kliping noise.


5
Standar ATSC yang Anda tautkan di sini ditautkan dari wiki FFmpeg pada topik tersebut , sehingga tidak mengherankan bahwa rumus yang digunakan di sini adalah sama dengan yang diterapkan oleh FFmpeg dengan ac -2saklarnya. Dengan kata lain, satu-satunya perbedaan antara menggunakan filter ini dan melakukan ac -2adalah lebih banyak mengetik.
Hashim

18

Jawaban atas pertanyaan ini telah menjadi sedikit berantakan, dengan banyak berisi informasi yang berlebihan dan yang lainnya tidak akurat. Jawaban ini merupakan upaya untuk merampingkan informasi dalam jawaban ini sambil menghilangkan masalah di dalamnya.

Yang paling penting, perlu diingat bahwa jawaban Gregory, yang saat ini merupakan jawaban terpilih untuk pertanyaan ini, tidak berbeda dengan menggunakan -ac 2saklar - lebih lanjut tentang ini di bawah ini.

Downmixing aliran audio saluran 5.1 ke stereo dengan -ac 2

FFmpeg hadir dengan kemampuan bawaan untuk downmixing trek 5.1 ke stereo, dan ini juga solusi yang direkomendasikan oleh dokumentasi FFmpeg :

Catatan: ffmpeg mengintegrasikan sistem down-mix (dan up-mix) default yang lebih disukai ( -acopsi) di atas filter pan kecuali Anda memiliki kebutuhan yang sangat spesifik.

The -ac 2beralih bekerja dengan mencampur proporsi yang pertama 5 saluran dari sungai 6-channel sumber ini - Kembali Kiri, Kanan Kembali, Front Kiri, Front Kanan dan Front Center - dalam Front Kiri dan Kanan depan saluran output stream stereo:

masukkan deskripsi gambar di sini

Saat melakukannya, audio dari saluran LFE ( .1 in 5.1, disediakan untuk subwoofer dan digunakan untuk efek frekuensi rendah yang dalam) dibuang sepenuhnya ketika menggunakan opsi ini.

Sayangnya, dalam pengujian saya -ac 2menghasilkan tingkat keseluruhan musik dan dialog yang paling berbeda dengan sumbernya, menjadikannya formula downmix yang memberikan output terburuk dari semua formula yang saya uji, meskipun Anda dapat mengujinya dan menemukan bahwa itu memberi Anda downmix yang cukup memadai untuk kebutuhan Anda, dalam hal ini menggunakan formula lain akan berlebihan bagi Anda.


Untuk downmix track DTS dengan -ac 2 tanpa transcoding (yaitu untuk menjaga codec dan ekstensinya tetap sama):

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

Seperti yang ditunjukkan oleh Mephisto dalam jawabannya, jika dialog dan musik terdengar seimbang antara satu sama lain untuk Anda tetapi tidak memiliki volume, Anda dapat mengurangi aliran sementara juga meningkatkan volumenya:

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

Untuk -volsakelar, volume 100% di sumber setara dengan nilai integer 256, dan menggunakan nilai lebih besar dari ini akan meningkatkan volume keseluruhan aliran audio. Namun, perhatikan bahwa melakukan terlalu banyak dapat mengakibatkan distorsi atau artefak, terutama selama bagian yang lebih keras.

Untukmengurangi aliran audio ke stereo dan transkode ke AC3 codec, misalnya:

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

Downmixing aliran audio saluran 5.1 ke stereo dengan algoritme campuran khusus

Jika Anda ingin downmix berkualitas lebih tinggi, atau Anda benar-benar harus memasukkan aliran LFE ke dalam output Anda, Anda dapat menggunakan saklar filter audio FFmpeg ( -af) untuk downmix audio menggunakan formula campuran khusus.

Downmixing dengan rumus ATSC (jawaban Gregory)

Pada saat memposting jawaban ini, jawaban pilihan teratas untuk pertanyaan ini adalah milik Gregory , yang menempatkan formula dari spesifikasi ATSC (lihat bagian 7.8.2, Menurunkan ke Dua Saluran ) ke dalam filter audio FFmpeg. Spesifikasi ini sendiri langsung terkait dengan dengan dokumentasi FFmpeg pada topik , menunjukkan itu sangat mungkin menjadi rumus yang sama yang FFmpeg sudah menerapkan untuk perusahaan -ac 2switch. Jika ini benar, maka mengetik seluruh rumus dalam jawaban Gregory tidak akan berbeda dengan menggunakan -ac 2sakelar, dan karenanya membuang-buang waktu.

Saya memutuskan untuk menguji hal ini dengan mengkode ulang input audio yang sama menggunakan keduanya -ac 2dan -affilter dari jawaban Gregory (perintah persis yang digunakan dapat dilihat pada catatan kaki untuk jawaban ini).

Saya kemudian membandingkan ukuran file output yang dihasilkan dan menemukan mereka, byte-untuk-byte, ukuran yang sama:

masukkan deskripsi gambar di sini

Akhirnya, saya membuka kedua file output di Audacity, dan membandingkan bentuk gelombang mereka untuk mengkonfirmasi mereka identik (klik untuk memperbesar):

masukkan deskripsi gambar di sini

Karena itu, tampaknya cukup konklusif bahwa rumus ATSC yang dirinci dalam jawaban Gregory adalah yang sama sudah diterapkan oleh FFmpeg , dan bahwa menggunakannya sepenuhnya berlebihan ketika tidak melakukan apa pun yang -ac 2tidak, dan merupakan perintah yang jauh lebih rumit.

Downmixing tanpa membuang saluran LFE (jawaban Dave_750)

Dari beberapa yang disertakan dalam jawaban, ini adalah satu-satunya formula downmix yang tampaknya mencampur saluran LFE ke stereo output alih-alih membuang seluruhnya, dan sebagai hasilnya, salah satu yang memastikan paling sedikit suara dari sumber adalah kalah.

Tingkat volume keseluruhan lebih tinggi dan lebih lengkap daripada melakukan -ac 2, tetapi juga masih lebih rendah daripada downmix Dialog Nightmode di bawah ini. Namun, level musik lebih dekat ke sumber daripada downmix Dialog Nightmode, dan karena dimasukkannya trek LFE, meningkatkan volume output saat menggunakan rumus downmix ini dapat membuat aliran output yang terdengar lebih benar ke sumber 5.1 daripada yang lainnya. rumus yang saya uji.

Jika Anda memiliki kemampuan, saya akan sangat menyarankan untuk menyandikan aliran audio Anda menggunakan rumus downmix dan downmix Dialog Nightmode, dan dengan hati-hati membandingkan bentuk gelombang keduanya untuk menentukan mana yang lebih baik.

Untuk downmix trek 5,1 ke stereo menggunakan formula ini dan meningkatkan level volumenya menjadi 425 (di mana 256 adalah 100% dari level volume sumber asli):

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"

Downmixing dengan Dialog Nightmode Robert Collier (jawaban Shane Harrelson)

Rumus Nightmode Dialogue, yang dibuat oleh Robert Collier di forum Doom9 dan bersumber dari Shane Harrelson dalam jawabannya, menghasilkan downmix yang jauh lebih baik daripada -ac 2switch - alih-alih dialog yang terlalu sunyi, itu membawa mereka kembali ke level yang lebih dekat dengan sumber.

Dari deskripsi campuran Robert Collier:

Setelah mengkonversi banyak trek film DTS dari 5.1 ke 2.0 menggunakan eac3to, saya telah menemukan pemetaan saluran eac3to default untuk menghasilkan dialog yang sangat tenang dan musik yang terlalu keras dan adegan aksi. Walaupun koefisien eac3to channel downmix memiliki dasar ilmiah, mereka sering tidak terdengar bagus dalam praktiknya karena volume dialog yang rendah. Preset ini adalah untuk mereka yang mencari dialog yang jelas dengan musik saluran kiri dan kanan masih terdengar tetapi lebih di latar belakang.

Seperti yang Anda lihat - pusat depan (dialog) masuk dengan benar sekarang dan tetap pada tingkat asli - sementara musik dan ledakan tetap efek latar belakang dan tidak mengalahkan Anda. Prasetel ini memecahkan masalah Anda yang harus terus-menerus mengutak-atik kenop volume saat menonton DTS 5.1 yang dikonversi ke 2.0 film untuk mendengarkan dialog. (Terutama untuk menonton film di malam hari di mana Anda tidak ingin membangunkan orang lain tetapi masih ingin dapat mendengar dialog).

Sayangnya, musik formula downmix ini jauh lebih rendah daripada di sumber 5.1 (yang kemungkinan oleh desain mempertimbangkan niat Collier untuk membuat campuran "nightmode") dan karena sepenuhnya kehilangan trek LFE, audio output keseluruhan tidak terdengar penuh atau dekat dengan sumber seperti rumus Dave_750 dengan volume yang ditingkatkan .

Namun, jika karena alasan tertentu Anda ingin menghindari meningkatkan volume keseluruhan aliran, maka Dialog Nightmode kemungkinan akan menjadi pilihan terbaik Anda - meskipun sekali lagi, saya sangat merekomendasikan untuk menyandikan aliran audio Anda ke keduanya dan membandingkan bentuk gelombang keduanya dengan hati-hati. .

Untuk downmix dengan rumus Nightmode Dialogue di FFmpeg:

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" 

Jawaban Tarc

Jawaban ini hanya menempatkan rumus downmix Nightmode Dialog dari jawaban Shane Harrelson menjadi perintah untuk mengubah aliran audio dalam wadah MKV. Sementara perintah yang diberikan dalam jawaban ini akan bekerja dengan baik pada aliran audio seperti itu, mengadaptasinya untuk trek audio mandiri akan memberikan kesalahan:

Penyaringan dan streaming tidak dapat digunakan bersama

Ini karena codec audio tidak dapat disalin ketika downmixing - seperti semua perubahan lain yang dilakukan FFmpeg ke aliran output, downmix mensyaratkan trek dikodekan ulang agar perubahan diterapkan.

Perintah ini juga termasuk -ac 2saklar redundan yang diabaikan oleh FFmpeg.


Perintah uji

Untuk menunjukkan keandalan pengujian yang saya lakukan untuk jawaban ini, di bawah ini adalah semua perintah yang saya gunakan untuk menguji setiap rumus downmix.

Perintah tes yang digunakan untuk -ac 2opsi:

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

Perintah tes digunakan untuk jawaban 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"

Perintah tes yang digunakan untuk jawaban 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"

Perintah uji yang digunakan untuk jawaban 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
Wawasan yang mengesankan! Terima kasih telah meluangkan waktu untuk membagikan ini. Anehnya, itu -ac 2memberi saya hasil yang lebih rendah untuk memulai, yang mendorong posting asli. Saya akan mencoba ini lagi dan jika mungkin, bagikan kutipan 5.1 yang tidak memberikan hasil yang memuaskan dengan built-in down-mix. Juga sangat bagus untuk mengetahui bahwa Anda dapat melakukan down-mix tanpa transcoding!
sebagainyarin

@forthrin Ingatlah bahwa penyandian dan transkode adalah dua hal yang berbeda. Transcoding mengkonversi dari satu codec / ekstensi ke yang lain, dan pengkodean mengkonversi ke codec / ekstensi yang sama. Anda dapat downmix dan menerapkan efek FFmpeg lainnya ke stream tanpa transcoding, tetapi tidak tanpa encoding. The ac -2pilihan memberi saya hasil yang lebih rendah yang sebagian besar dari semua formula downmix juga, saya pikir ini hanya gagal formula ATSC standar ini.
Hashim

Saya mencoba ini sekarang. Tampaknya itu ffmpeg -i 5.1.mp4 -ac 2 2.mp4berfungsi, tetapi ffplay -i 5.1.mp4 -ac 2tidak.
sebagainyarin

9

Coba downmix ini:

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

seperti yang disarankan oleh Robert Collier di forum Doom9.


2
Apa arti semua opsi itu? Jika Anda menjelaskannya, orang-orang akan dapat menggunakan jawaban Anda untuk menyelesaikan masalah yang berbeda alih-alih hanya menyalin-menempel.
David Richerby

2
@DavidRicherby -ac = Saluran Audio (2 untuk stereo), -af = Audio Filter
Cadangan

3
Mencoba ini untuk film 5.1 dan setidaknya stereo output terdengar sangat baik bagi saya. Dialog yang jelas dan sepertinya tidak ada yang hilang. Akan lebih bagus lagi jika seseorang dengan pengetahuan VLC dapat membagikan apa yang dilakukan di default 5.1 to 2.0 downmix di sana.
sebagainyarin

2
@ DavidVicherby: Opsi di dalam filter audio (-af) adalah: FL = Depan-kiri; BL = Kembali-kiri; FC = Front-center; FR = Depan-kanan; BR = Kembali kanan. Pelampung adalah faktor linier untuk mengurangi (<1) atau meningkatkan (> 1) volume saluran yang dikalikan. FL = FC + 0.30 * FL + 0.30 * BL mengatur saluran kiri-depan ke saluran Front-Center ditambah 30% dari kiri-depan dan 30% dari saluran-kiri-belakang.
kronenpj

1
FWIW: Saya menemukan campuran ini membuat dialog terlalu keras dibandingkan dengan musik dan suara sekitar. Campuran teknis yang lebih benar yang diberikan dalam jawaban Tarc jauh lebih menyenangkan bagi saya. Jadi saya kira Anda mungkin harus mencoba yang terbaik untuk Anda, tergantung situasinya.
jlh

3

Jadi, dengan menggabungkan @Shane Harrelson dengan jawaban @Jordan Harris untuk pertanyaan lain - dengan mode malas dihidupkan - di sini apa yang diperlukan untuk mengubah input_51.mkv(5.1) menjadi 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

The -c:v copyBagian berarti bahwa aliran video tidak disentuh (saya kira bahwa v ideo c odec pengaturan sedang polisi ied). Tanpa itu, akan membutuhkan waktu lebih lama. Hanya mengulangi dari jawaban di atas untuk kelengkapan, -ac 2berarti dua saluran audio dan -afmenentukan filter audio.

Setelah melihat ke dalam perintah sedikit, saya menemukan bahwa itu mengatur bagaimana dua saluran stereo dikomposisikan; yang FL(kiri depan saluran) diambil dari aslinya FC(depan tengah) ditambah 0.30*FL(30% dari kiri depan) ditambah 0.30*BL(30% dari bagian belakang kiri) dan sebagainya.


Apakah ini akan membuat saluran pusat konsisten dan terdengar?
Freedo

2

Ini adalah pertanyaan lama sekarang, tetapi mengarahkan saya ke arah yang benar dan ingin membagikan hasil saya:

-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"

Menempatkan setengah dari FC dan LFE ke kiri dan kanan memberikan total 1 untuk volume efektif mereka dari kedua speaker. Menggunakan .707 * Depan / Belakang Kiri / Kanan membawa saluran-saluran tersebut ke level yang baik sehingga tidak mengalahkan pusat.


1

Jika opsi -ac 2 memberi Anda downmix seimbang di mana baik musik maupun ucapannya tidak terdengar lebih dari komponen lainnya, Anda hanya perlu meningkatkan volume dengan

-vol 512

Saya menggunakan 512 dalam contoh, yang meningkatkan suara membuatnya dua kali lebih keras. Aturannya adalah 256 sama dengan 100%

Jangan terlalu tinggi dengan nilainya, dan pastikan untuk memeriksa hasilnya di bagian-bagian film dengan ledakan atau suara keras. Apakah sangat mudah untuk memperkenalkan distorsi dengan menggunakan nilai yang terlalu tinggi.


1

-ac 2

Volume saluran di downmix tidak berubah dengan codec floating point -> pcm_f32le, aac

Volume dalam downmix (5.1 ke 2.0 tanpa LFE) berkurang sebesar 1 / 2.5 = -7.96 dB dengan codec integer -> pcm_s16le, libfdk_aac

Film memiliki suara yang diarahkan ke satu arah, dan tidak ada tekanan suara maksimal di semua saluran. Jadi mengurangi volume downmix salah, sedikit tingkat kompresi adalah cara yang benar. Itulah yang dilakukan Dolby.


0

Setelah membaca seluruh halaman ini dan beberapa percobaan, saya membuat skrip yang disebut "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 \

Tweak variabel di atas sesuai keinginan Anda. Saya tidak punya masalah dengan volume rendah jadi tinggalkan begitu saja, tetapi mudah ditambahkan.


0

Filter ffmpeg "-ac 2" berfungsi dengan baik selama target Anda dikodekan pcm_s16le. Saat menyandikan ke pcm_f32le dalam format wav, volume meningkat sebesar 9dB dan lebih banyak lagi. Karenanya: Jangan gunakan filter "-ac 2" dalam kasus seperti itu.


Mengapa volumenya meningkat? Di mana Anda belajar tentang ini?
sebagainyarin

Tidak tahu, kenapa. Tapi saya pengguna ffmpeg yang sangat sering (kompilasi sendiri). Ambil saja sumber (sisi) 5.1 dan konversikan menjadi pcm_s16le dan juga file pcm_f32le wav menggunakan "-ac 2" kedua kali. Bandingkan volume puncak dua file wav dan Anda akan melihat (dan mendengar):
Frank-Michael Fischer

ini terjadi menggunakan mis ffmpeg versi N-93636-g6829c3c
Frank-Michael Fischer
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.