FFMPEG: konversi m4a ke mp3 menggunakan banyak core

2

Saya menggunakan perintah berikut untuk mengkonversi format m4a ke mp3

ffmpeg -i audio.m4a -acodec libmp3lame audio.mp3

Saya memiliki 32 x86 core, namun proses libmp3lame dalam satu utas. Saya tahu libmp3lame tidak mendukung multithreading, jadi saya terbuka untuk alternatif lain yang dapat dijalankan di CLI ubuntu.

Jika audio.m4a adalah video berdurasi 2 jam, biasanya dibutuhkan> 3 menit dan kecepatan tampaknya 45x hingga 50x.

Tujuan utama saya adalah untuk mengkonversi beberapa video youtube dalam format mp3 dalam hitungan detik.

Pembaruan 1:

Karena saya menggunakan CPU 32 core, ketika hanya ada satu konversi video, ia hanya menggunakan satu inti. Jadi dalam hal ini bagaimana menggunakan beberapa core, untuk mendapatkan output lebih cepat. Saya ingin mencapai maksimum dari CPU. Juga jika FFmpeg bukan jawabannya, apakah ada cara lain.

Johny Pie
sumber
2
Tidak bisakah Anda memulai beberapa proses ffmpeg secara paralel?
slhck
@slhck tidak, libmp3lame tidak mendukung banyak utas :(
Johny Pie
Maksud Anda, bahkan ketika Anda memulai, katakanlah, 20 proses ffmpeg yang berbeda, hanya satu inti yang digunakan?
slhck
Sslhck tidak sayang, saya katakan satu proses satu inti
Johny Pie
Jadi yang saya sarankan adalah memulai 20 proses. Apakah itu tidak berhasil?
slhck

Jawaban:

3

Karena encoder adalah single-threaded saja, untuk membuat encoding yang paling efisien pada sistem multi-core, yang dapat Anda lakukan adalah meluncurkan beberapa proses secara paralel.

Misalnya, jika Anda menggunakan shell:

ffmpeg -i input1.mp4 -c:a libmp3lame output1.mp3 &
ffmpeg -i input2.mp4 -c:a libmp3lame output2.mp3 &
…

The &menempatkan perintah ke latar belakang . Perintah akan dijalankan secara paralel dan beban harus didistribusikan di antara inti CPU Anda.

slhck
sumber
Ya sayang, saya tahu. Yang saya inginkan adalah membuat proses tunggal terjadi dalam multithread.
Johny Pie
Saya telah memperbarui pertanyaan saya, silakan periksa. Terima kasih
Johny Pie
2
Anda tidak dapat secara ajaib membuat proses single-threaded dieksekusi di banyak utas. Ada versi LAME multithread mandiri yang tersedia, tetapi saya tidak dapat menjamin bahwa itu berfungsi dengan baik: github.com/dheller1/lame_pthreads
slhck
lihat situs web ini onlinevideoconverter.com/es yang melakukan konversi hampir secara instan.
Johny Pie
3

GNU Parallel terdengar persis seperti apa yang Anda cari.

Berikut ini adalah contoh bagaimana Anda dapat menggunakan GNU Parallel (dengan asumsi Anda sudah memiliki direktori dengan semua *.m4afile Anda videos) menggunakan perintah asli Anda:

find /path/to/videos -name "*.m4a" | parallel 'ffmpeg -i {} -acodec libmp3lame {.}.mp3'

Dua hal untuk dijelaskan:

1 : Output dari findperintah (yaitu daftar .m4afile yang akan dikonversi) akan disalurkan ke parallelperintah, yang pada gilirannya (secara default) akan melakukan pekerjaan sebanyak yang ada core . Intinya adalah memisahkan output dari findperintah, dan mendistribusikannya di berbagai pekerjaan untuk dikerjakan .

2 : Per Tutorial Paralel GNU , {}adalah tempat argumen Anda akan muncul, {.}akan menggantikan argumen Anda dan menghapus ekstensi terminal (dalam hal ini .m4a), dan output Anda akan menjadi nama file asli tetapi dengan .mp3ekstensi.

CATATAN : Contoh ini akan menulis semua file Anda yang dikonversi ke tempat file asli Anda. Jika ini merupakan masalah, maka hanya lewat direktori untuk menyimpan file yang dikonversi dalam string argumen yang berisi ffmpegperintah:

find /path/to/videos -name "*.m4a" | parallel 'ffmpeg -i {} -acodec libmp3lame /path/to/converted/vids/{.}.mp3'
Maverick
sumber
(1) Jadi, jika (seperti yang disebutkan) dibutuhkan OP tiga menit untuk memproses file, dengan teknik Anda ia akan dapat memproses 32 file dalam tiga menit. Itu mungkin yang terbaik yang bisa dia dapatkan, tapi bukan itu yang dia cari - dia sedang mencari cara untuk memproses satu  file dalam waktu kurang dari sepuluh detik. (2) Tolong jangan gunakan lsuntuk menghasilkan nama file untuk proses lain untuk digunakan (atau menyarankan orang untuk melakukannya).
Scott
1

Ada implementasi multi-threaded dari encoder mp3 lumpuh di internet. Saya bisa melacak satu di sini

https://github.com/dheller1/lame_pthreads

Jika Anda memiliki ruang penyimpanan yang besar, Anda bisa menggunakan ffmpeg untuk mengubah semua file m4a menjadi file wav dan kemudian mengarahkan lame_pthreads ke folder itu.

Karthik M
sumber