Konwertuj .flac na .mp3 za pomocą ffmpeg, zachowując wszystkie metadane


88

Jak mogę przekonwertować .flac na .mp3 za pomocą ffmpeg, zachowując wszystkie metadane (czyli konwersję komentarza Vorbis w plikach .flac na metadane ID3v2 z .mp3)?


5
Pamiętaj, że następnym razem powinieneś zadać ffmpegpytania dotyczące użycia CLI w Super User . Stack Overflow służy tylko do pytań dotyczących programowania. Ponadto FLAC oficjalnie obsługuje tylko komentarze Vorbis , więc zakładam, że chcesz przekonwertować na ID3v2 zamiast „zachować”.
Llogan

Ok, naprawiłem moje pytanie. Zadałem tutaj, ponieważ widziałem takie pytania na StackOverflow (np. To lub to ) i założyłem, że podzielenie się moją wiedzą może być interesujące. Widzę również, że istnieje tag ffmpeg , więc dlaczego nie udostępnić tutaj mojego rozwiązania? ffmpeg jest używany w wielu aplikacjach przez wielu programistów.
Vito Gentile

3
Znacznik ffmpeg mówi: „Pytania dotyczące interaktywnego korzystania z narzędzia wiersza poleceń FFmpeg należy zadawać w programie Super User.”. To nic wielkiego, ale chciałem tylko zwrócić na to uwagę, ponieważ moim zdaniem jest tu zbyt wiele pytań niezwiązanych z tematem.
llogan

Odpowiedzi:


152

Następujące polecenie zachowuje wysoką jakość na .mp3 (320 kbps), a metadane z pliku .flac są konwertowane do formatu ID3v2, który można dołączyć do plików .mp3:

ffmpeg -i input.flac -ab 320k -map_metadata 0 -id3v2_version 3 output.mp3

1
Warto zauważyć, że "ffmpeg" może wymagać zastąpienia przez "avconv".
shockburner

5
FWIW ffmpeg3.2 automatycznie kopiuje metadane do ID3v2 z FLAC bez konieczności określania -map_metadata 0 -id3v2_version 3, chociaż nie kopiuje do tagów ID3v1. Używam do tego osobnego narzędzia.
Dai

1
teksty nadal nie są kopiowane
user151496

1
Czy dzieli flac, jeśli jest kilka części?
Artem

1
@Artyom Prawdopodobnie powinieneś mieć plik cue wraz z flacem, w którym zaznaczone są punkty podziału. Jeśli tak, możesz użyć shnsplit (konsola) lub flakonu (GUI), aby podzielić plik i przekonwertować części na mp3. Jeśli masz tylko jeden flac , możesz albo napisać dla niego cui , albo użyć opcji -ss i -t ffmpeg, aby wyciąć każdy utwór.

56

Doskonała odpowiedź powyżej. Używam go razem z find, aby dodać wszystkie pliki FLAC w poddrzewie do iTunes za pomocą tego polecenia

find . -name "*.flac" -exec ffmpeg -i {} -ab 160k -map_metadata 0 -id3v2_version 3 {}.mp3 \;

Aby automatycznie dodać wynikowe pliki do iTunes, pobierz katalog importu iTunes z

find ~/Music/ -name "Automatically Add*"

wynik np

/Users/sir/Music//iTunes/iTunes Media/Automatically Add to iTunes.localized

Następnie uruchom np

find . -name "*.mp3" -exec mv {} "/Users/sir/Music//iTunes/iTunes Media/Automatically Add to iTunes.localized/" \;

Aby automatycznie dodać wszystkie przekonwertowane utwory do iTunes.


3
" / Users / sir ", lmao.
Harry Svensson

Anegdota: wszyscy użytkownicy w naszej firmie mają nazwy gwiazdek, skrócone do 3-5 znaków. Mój to „sirius”, krótki panie;)
user2707001

Nierozpoznana opcja „nazwa”.
MonsterMMORPG

14

Jeśli chcesz zaoszczędzić trochę miejsca, wypróbuj zalecenia hydrogenaud.io :

Bardzo wysoka jakość: HiFi, domu, lub ciche słuchanie, z najlepszego rozmiaru pliku -V0 (~245 kbps), -V1 (~225 kbps), -V2 (~190 kbps)lub -V3 (~175 kbps)są zalecane. Te ustawienia VBR zwykle dają przejrzyste wyniki. Mogą występować słyszalne różnice między tymi ustawieniami, ale są one rzadkie.

Źródło: http://wiki.hydrogenaud.io/index.php?title=LAME

Jeśli chcesz użyć tej opcji w ffmpeg, powinieneś użyć -q:a 0aliasu.

Kontroluj jakość za pomocą -qscale:a(lub aliasu -q:a). Wartości są specyficzne dla kodera, więc dla libmp3lame zakres wynosi 0-9, gdzie niższa wartość oznacza wyższą jakość. 0-3 zwykle daje przejrzyste wyniki, 4 (domyślnie) powinno być bliskie percepcyjnej przezroczystości, a 6 daje „akceptowalną” jakość. Opcja -qscale:ajest odwzorowana na -Vopcję w samodzielnym narzędziu lame interfejsu wiersza poleceń.

Źródło: https://trac.ffmpeg.org/wiki/Encode/MP3

Jeśli chcesz również metatagi ID3v1, powinieneś dodać -write_id3v1 1parametr.

Więc moje ostatnie polecenie to:

ffmpeg.exe -y -i input.flac -codec:a libmp3lame -q:a 0 -map_metadata 0 -id3v2_version 3 -write_id3v1 1 output.mp3

8

Testowałem następujące polecenie, aby przekonwertować infile.flacplik na outfile.mp3:

ffmpeg  -i infile.flac  -q:a 0  outfile.mp3

Począwszy od Ubuntu 16.04, powyższe polecenie wydaje się kopiować (głównie? Wszystkie?) Metadane.

-q:a 0mówi, ffmpegaby używać najwyższej jakości VBR.

Jednak ffmpegtranskodowałem okładkę albumu z jpegna png, co zwiększyło rozmiar okładki.

Stream mapping:
  Stream #0:1 -> #0:0 (mjpeg (native) -> png (native))
  Stream #0:0 -> #0:1 (flac (native) -> mp3 (libmp3lame))

(Myślę, że powyższy rodzaj konwersji ma sens, biorąc pod uwagę, jak ffmpegdziała ).

Po pewnym kopaniu znalazłem -c:v copyopcję, która określa, że ​​strumień wideo powinien być kopiowany, a nie transkodowany. Pełne polecenie to:

ffmpeg  -i infile.flac  -c:v copy  -q:a 0  outfile.mp3

Powyższe polecenie powoduje:

Stream mapping:
  Stream #0:1 -> #0:0 (copy)
  Stream #0:0 -> #0:1 (flac (native) -> mp3 (libmp3lame))

3

Aby rekurencyjnie przekonwertować w mp3 wszystkie pliki flac w zagnieżdżonych folderach, użyłem tego polecenia:

find '~/Music/' -iname '*.flac' -exec bash -c 'D=$(dirname "{}"); B=$(basename "{}"); mkdir "$D/mp3/"; ffmpeg -i "{}" -ab 320k -map_metadata 0 -id3v2_version 3 -acodec libmp3lame "$D/mp3/${B%.*}.mp3"' \;

Utworzy folder o nazwie „mp3” w folderze z plikami flac, a wewnątrz folderu mp3 zapisze względne pliki mp3 z szybkością transmisji 320 kb / s, bez zachowywania w nazwie starego rozszerzenia pliku.


3

Jedna linijka do konwersji wszystkich .flacplików do .mp3jednego katalogu, zachowując większość metadanych:

for file in *.flac; do ffmpeg -i $file -q:a 0 ${file:r}.mp3; done

(Uwaga: ${file:r}usuwa rozszerzenie podanej ścieżki do pliku)

ffmpeg: flac do mp3


Wystarczy zacytować zmienną $filepodobnego "$file".
Chazy Chaz

:rwydaje się być zshmodyfikatorem, który nie działa bash. W Bash można zastąpić "${file:r}.mp3"z "${file%.flac}.mp3".
mivk

aby pokazać tylko nazwę pliku z pliku, w użyciu bash${file%.*}
Evhz

2

Wiem, że o to nie pytano, ale biorąc pod uwagę, że jednym z powodów, dla których tak się stało (przynajmniej tego chciałem), jest to, że muzykę można importować do Apple iTunes, który nie obsługuje formatu FLAC. W takim przypadku bardziej sensowne jest przekonwertowanie FLAC na własny bezstratny format Apple, m4a. Użyłem tego polecenia, aby przekonwertować wszystkie pliki w bieżącym folderze, zachowując podobne rozmiary plików.

find . -name "*.flac" -exec ffmpeg -i {} -map_metadata 0 -acodec alac {}.m4a \;


Nierozpoznana opcja „nazwa”. Błąd podczas dzielenia listy argumentów: Nie znaleziono opcji
MonsterMMORPG

@MonsterMMORPG prawdopodobnie przegapiłeś wpisanie. po poleceniu znajdź. Plik. mówi find, aby szukał w bieżącym folderze, a -name mówi mu, aby szukał pasujących nazw plików.
Dhiraj Gupta

2

Ten skrypt flac2mp3.sh używa ffmpegdo konwersji drzewa folderów plików FLAC na inne drzewo folderów plików MP3. Okładka jest dołączona, jeśli jest obecna. Możesz ustawić CORESzmienną, aby tworzyć zadania w tle i konwertować kilka plików jednocześnie.


daje błąd sed: -e wyrażenie # 1, char 26:
niezakończone

Dokładnie to, czego szukałem, dzięki!
Poprawiłem
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.