আমি কীভাবে একা টার্মিনালটি ব্যবহার করে LLAY এবং FLAC ব্যবহার করে .flac থেকে .mp3 এ যেতে পারি?


31

দীর্ঘদিন ধরে আমি একটি আপেক্ষিক ক্লানকি কৌশল ব্যবহার করছি যা একটি লেম প্লাগইন সহ অড্যাসিটির সাথে জড়িত। আমার ধারণা এটি ঠিক আছে তবে টার্মিনালের পদ্ধতির আবেদনটি হ'ল আমি আমার সাথে আরও কিছুটা সুক্ষ্ম হতে পারি [options]এবং সম্ভবত আরও টু-ডেট বাইনারি ব্যবহার করতে পারি।

তদুপরি, আমার ম্যাকবুক এখন খানিকটা বাড়ছে এবং আমি যদি অপ্রয়োজনীয় জিইউআই থেকে মুক্তি পেতে পারি তবে আরও ভাল।

আগাম ধন্যবাদ.


1
এটি করার জন্য আপনি আসলে পয়েন্ট পাবেন;)
মর্টিমার

হাহাহা ... আমি প্রশ্নের উত্তর দিয়েছি তবে এটি বলছে যে আমি আমার উত্তর দুটি দিনের জন্য নিশ্চিত করতে পারছি না। দুঃখিত। এখনও কীভাবে জিনিসগুলি এখানে কাজ করে তা নির্ণয় করছে। দুর্দান্ত সাইট। : ডি
বোহজ

উত্তর:


41

ট্যাগ সংরক্ষণ না করে একটি একক ফাইল রূপান্তর করা

brew install lame
flac --decode --stdout test.flac | lame --preset extreme - test.mp3

একটি শেল স্ক্রিপ্ট যা কিছু আইডি 3 ট্যাগ সংরক্ষণ করে

#!/bin/bash

for f in "$@"; do
    [[ "$f" != *.flac ]] && continue
    album="$(metaflac --show-tag=album "$f" | sed 's/[^=]*=//')"
    artist="$(metaflac --show-tag=artist "$f" | sed 's/[^=]*=//')"
    date="$(metaflac --show-tag=date "$f" | sed 's/[^=]*=//')"
    title="$(metaflac --show-tag=title "$f" | sed 's/[^=]*=//')"
    year="$(metaflac --show-tag=date "$f" | sed 's/[^=]*=//')"
    genre="$(metaflac --show-tag=genre "$f" | sed 's/[^=]*=//')"
    tracknumber="$(metaflac --show-tag=tracknumber "$f" | sed 's/[^=]*=//')"

    flac --decode --stdout "$f" | lame --preset extreme --add-id3v2 --tt "$title" --ta "$artist" --tl "$album" --ty "$year" --tn "$tracknumber" --tg "$genre" - "${f%.flac}.mp3"
done

স্ক্রিপ্টটি ব্যবহার করতে, এটি এটিকে অন্য কোথাও সংরক্ষণ করুন ~/bin/flac2mp3এবং এটি দিয়ে সম্পাদনযোগ্য করুন chmod +x ~/bin/flac2mp3

এটি আপনার সঙ্গীত ফোল্ডারে সমস্ত ফ্ল্যাক ফাইল রূপান্তরিত করবে:

find ~/Music/ -name '*.flac' -exec ~/bin/flac2mp3 {} \;

বা কিছুটা দ্রুত, যেহেতু এটি কেবল একবার flac2mp3 কল করে:

find ~/Music/ -name '*.flac' -print0 | xargs -0 ~/bin/flac2mp3

2
আপনার উত্তরটি এখানে পোস্ট করা উচিত, প্রশ্নের পাঠ্যের কোনও রেফারেন্স নয়। আইএমএইচও, আপনার প্রশ্ন এবং উত্তর উভয়ই সম্পাদনা করা উচিত এবং এখানে উপসংহারে সরানো উচিত।
lpacheco

ঠিক আছে, করবে। দুঃখিত।
Boehj

2
${file%.flac}.mp3অসাধারণ! পূর্বে আমি ${x:: ${#x}-3}m4aগানের ফাইলের নাম .wav থেকে .m4a এ পরিবর্তন করতে ব্যবহার করছিলাম । যে উপায়টি দেখতে বেশ সহজ easier
জেসন সালাজ

1
দেখে মনে হচ্ছে একটি অপশন in-তে একটি ত্রুটি রয়েছে P সম্ভবত পঙ্গু সংস্করণের কারণে, তবে বর্তমান কোডটি খোঁড়াটিকে বলবে না যে এটি ইনপুট ফাইল হিসাবে ইনপুট স্ট্রিম ব্যবহার করবে এবং আউটপুট ফাইলও নির্দিষ্ট করা হয়নি, যেহেতু স্ট্রিম ব্যবহৃত হয়, তাই এটি প্রয়োজনীয়। আমার জন্য চূড়ান্ত কোডটি হ'ল: !/bin/sh file="$1" outfile=${file%.flac}.mp3 eval $(metaflac --export-tags-to - "$file" | sed "s/=\(.*\)/='\1'/") flac -cd "$file" | lame --preset standard \ --add-id3v2 --tt "$TITLE" --ta "$ARTIST" --tl "$ALBUM" \ --ty "$DATE" --tn "$TRACKNUMBER" --tg "$GENRE" \ - "$outfile"
মেহাল

এছাড়াও এটি এমন 'স্ক্রিপ্ট' স্টাফ তৈরি করে এমন স্ক্রিপ্ট তৈরি করা ভাল ...
মেহাল

10

ffmpeg ডিফল্টরূপে ট্যাগগুলি সংরক্ষণ করে (তবে আর্ট কভার করে না)।

for f in *.flac; do ffmpeg -i "$f" -aq 1 "${f%flac}mp3"; done

-aq 1-V 1খোঁড়া মধ্যে অনুরূপ । -acodec libfaacফাইলগুলি এএসি তে রূপান্তরিত করবে:

for f in *.flac; do ffmpeg -i "$f" -acodec libfaac -aq 200 "${f%flac}m4a"; done

আমি কেবল এটি করেছি এবং এটি বলেছিল: `` `মেটাডেটা: মন্তব্য: কভার (সামনের) এনকোডার: Lavc57.107.100 পিএনজি` `। ম্যাকোএস অনুসন্ধানকারী কভার আর্ট দেখায়। ব্রিফ থেকে ffmpeg 3.4.2।
হাব্বী

আমি তখন বুঝতে পেরেছিলাম আমার ffmpeg অনেক পুরানো। ওয়ার্কিং কভার আর্ট সহ একই আকারের - একই আকারের এমপি 3 ফাইলগুলির সাথে আমি এটি 4.1.3 এ আপগ্রেড করেছি।
হাবি

4

আপনার ছেলেরা যা নিয়েছিল আমি তা নিয়েছিলাম, কিন্তু তারপরে xargsচাকরিগুলিকে সমান্তরাল করে ব্যবহার করে এটি আরও দ্রুত চালিত করে তুলেছি।

find <directory> -name '*.flac' -print0 | xargs -0 -P8 -n1  /usr/local/bin/flac2mp3

তারপরে এটি উপরে / usr / স্থানীয় / বিন / flac2mp3 থেকে স্ক্রিপ্ট script

#!/usr/bin/env bash

for f in "$@"; do
  [[ "$f" != *.flac ]] && continue
  album="$(metaflac --show-tag=album "$f" | sed 's/[^=]*=//')"
  artist="$(metaflac --show-tag=artist "$f" | sed 's/[^=]*=//')"
  date="$(metaflac --show-tag=date "$f" | sed 's/[^=]*=//')"
  title="$(metaflac --show-tag=title "$f" | sed 's/[^=]*=//')"
  year="$(metaflac --show-tag=date "$f" | sed 's/[^=]*=//')"
  genre="$(metaflac --show-tag=genre "$f" | sed 's/[^=]*=//')"
  tracknumber="$(metaflac --show-tag=tracknumber "$f" | sed 's/[^=]*=//')"

  flac --decode --stdout "$f" \ 
         | lame --preset extreme \
                --add-id3v2 \
                 --tt "$title" \
                 --ta "$artist" \
                 --tl "$album" \
                 --ty "$year" \
                 --tn "$tracknumber" \
                 --tg "$genre" \
                 - "${f%.flac}.mp3"
done

এবং সমান্তরালতা ব্যবহার করে পারফরম্যান্স গতির জন্য কিছু পরিসংখ্যান heres।

find <dirOfFlac24s> -name '*.flac -print0 | xargs -0 -P8 -n1 /usr/local/bin/flac2mp320  

0.00s user 0.00s system 60% cpu 0.002 total
115.94s user 1.40s system 359% cpu 32.655 total

time /usr/local/bin/flac2mp320 <dirOfFlac24s>/*.flac
96.63s user 1.46s system 109% cpu 1:29.98 total

আপনি দেখতে পাচ্ছেন এটি আমার সিপিইউগুলি আরও কার্যকরভাবে ব্যবহার করেছে, আমার একটি ইন্টেল আই 7 রয়েছে, সুতরাং 8 সম্ভবত প্রক্রিয়াগুলির সঠিক সংখ্যা।


2

FLAC উত্স ফাইলগুলি থেকে এমপি 3 এর সরাসরি এনকোডিং করার চেষ্টা করার সময় এই থ্রেডটি পেয়েছে। বোহজের উত্তরটি একটি সুনির্দিষ্ট স্ক্রিপ্টিং বিকল্প সরবরাহ করে, তবে আমি ব্যক্তিগতভাবে এফএফপিপিগ ব্যবহার করতে পছন্দ করি, সুতরাং এই টাস্কটি পরিচালনা করার জন্য আমি এই বাশ স্ক্রিপ্টটি নিয়ে এসেছি। ম্যাকোস সিয়েরাতে (10.12.2) পরীক্ষিত এবং দুর্দান্ত কাজ করে।

বেতনের অতিরিক্ত ভাতাদি: তোমার উচিত ছিল ffmpegএবং lameইতিমধ্যেই আপনার Mac এ ইনস্টল করা নেই। এটি করার সবচেয়ে সহজ উপায় হ'ম হোমব্রুয়ের মাধ্যমে। প্রথমে নিশ্চিত করুন যে আপনি হোমব্রিউটি এটি ইনস্টল করেছেন:

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

তারপরে এই কমান্ডটি ইনস্টল করুন ffmpegএবং lame:

brew install ffmpeg lame

এটি হয়ে গেলে আপনি এই স্ক্রিপ্টটি চালাতে প্রস্তুত। এই স্ক্রিপ্টটি ডিরেক্টরিতে FLAC ফাইলগুলি সন্ধান করবে তবে এফএলএসি ফাইলগুলি একই ডিরেক্টরিতে থাকলে আপনি এই স্ক্রিপ্টটি চালাচ্ছেন path/to/FLAC/filessimply .এটি চালিত হলে এটি একটি mp3/উপ-ডিরেক্টরি তৈরি করবে যেখানে এমপি 3 ফাইলগুলি হবে স্থাপিত।

find -E "path/to/FLAC/files" -type f -iregex ".*\.(FLAC)$" |\
  while read full_audio_filepath
  do

    # Break up the full audio filepath stuff into different directory and filename components.
    audio_dirname=$(dirname "${full_audio_filepath}");
    audio_basename=$(basename "${full_audio_filepath}");
    audio_filename="${audio_basename%.*}";
    # audio_extension="${audio_basename##*.}";

    # Set the MP3
    mp3_dirpath="${audio_dirname}/mp3";
    mp3_filepath="${mp3_dirpath}/${audio_filename}.mp3";

    # Create the child MP3 directory.
    mkdir -p "${mp3_dirpath}";

    # Get the track metadata.
    mp3_title=$(ffprobe 2> /dev/null -show_format "${full_audio_filepath}" | grep -i TAG:TITLE= | cut -d '=' -f 2- );
    mp3_artist=$(ffprobe 2> /dev/null -show_format "${full_audio_filepath}" | grep -i TAG:ARTIST= | cut -d '=' -f 2- );
    mp3_album=$(ffprobe 2> /dev/null -show_format "${full_audio_filepath}" | grep -i TAG:ALBUM= | cut -d '=' -f 2- );
    mp3_year=$(ffprobe 2> /dev/null -show_format "${full_audio_filepath}" | grep -i TAG:YEAR= | cut -d '=' -f 2- );
    mp3_track=$(ffprobe 2> /dev/null -show_format "${full_audio_filepath}" | grep -i TAG:TRACK= | cut -d '=' -f 2- | sed 's/^0*//' );
    mp3_tracktotal=$(ffprobe 2> /dev/null -show_format "${full_audio_filepath}" | grep -i TAG:TRACKTOTAL= | cut -d '=' -f 2- | sed 's/^0*//' );
    mp3_genre=$(ffprobe 2> /dev/null -show_format "${full_audio_filepath}" | grep -i TAG:GENRE= | cut -d '=' -f 2- );

    # Where the magic happens.
    ffmpeg -y -v quiet -nostdin -i "${full_audio_filepath}" -ar 44100 -sample_fmt s16 -ac 2 -f s16le -acodec pcm_s16le - | \
      lame --quiet --add-id3v2 --pad-id3v2 --tt "${mp3_title}" --ta "${mp3_artist}" --tl "${mp3_album}" --tn "${mp3_track}"/"${mp3_tracktotal}" --tg "${mp3_genre}" -r -m s --lowpass 19.7 -V 3 --vbr-new -q 0 -b 96 --scale 0.99 --athaa-sensitivity 1 - "${mp3_filepath}";

  done

আমি "হার্ড ওয়ে learned" শিখেছি এমন বিষয়ে কিছু নোট যাতে ইন্টারনেটের অন্যদের তুলনায় এই স্ক্রিপ্টে আমি অন্যভাবে যা করেছি তা থেকে অন্যরা লাভ করতে পারে।

  • grepট্যাগ পার্সিং (ব্যবহার করার জন্য কমান্ড FFprobe যা FFmpeg সঙ্গে ইনস্টল করা) ব্যবহার করে অবশ ক্ষেত্রে হয় -iবিকল্প এটি না করা grep -i
  • নিম্নলিখিত cutকমান্ডটি কেবলমাত্র =ট্যাগ নামের প্রথম ভিত্তিতে আউটপুট বিভাজনের মধ্যে সীমাবদ্ধ রয়েছে যাতে -f 2-বিকল্পটি কমান্ড তৈরি করে cut -d '=' -f 2-। উদাহরণস্বরূপ, প্যাভমেন্টের একটি গান রয়েছে যার শিরোনাম রয়েছে “5-4 = ityক্য” এবং যদি কেবল দ্বিতীয় অংশটিকে কাটা মাধ্যমে নির্বাচিত করা হত তবে সেই শিরোনামটি “5-4” এ কেটে ফেলা হত।
  • ট্র্যাক-এবং মোট ট্র্যাক-সংখ্যার জন্য আমি একটি অতিরিক্ত পাইপ যোগ করা sedযা বসানো শূন্যগুলি পরিত্রাণ পায়: sed 's/^0*//'
  • ইন্টারনেটের আশেপাশের অনুরূপ স্ক্রিপ্টগুলিতে, এফএফপিপিগ আউটপুটটি এমন একটি বিষয় -f wavএবং এটি আসলে এফএফএমপিগ আউটপুটকে সংকুচিত করবে যা পাইপ সেটআপে লাম এটিকে পুনরায় এনকোড করতে চলেছে এমন কোনও ধারণা রাখে না। পরিবর্তে এখানে আউটপুট সেট করা হয় -f s16le -acodec pcm_s16leযা মূলত RAW আউটপুট; এই জাতীয় প্রক্রিয়াতে অডিও পাইপ করার জন্য উপযুক্ত perfect
  • পাইপের লাম পাশের কাঁচা আউটপুটটি মোকাবেলা করতে আমাকে -rবিকল্পটি যুক্ত করতে হয়েছিল ।
  • এছাড়াও মনে রাখবেন --tt, --ta, --tl, --tnএবং --tgID3v2 ট্যাগ অগ্রহণযোগ্য জন্য অপশন। যখন অডিওটি একটি প্রক্রিয়া থেকে লামে প্রবাহিত হয় / উত্স থেকে উত্স ফাইল থেকে মেটাডেটা হারিয়ে যায়। এক প্রস্তাব বিকল্প বিকল্পটি সেটিংয়ের দ্বারা একটি টেক্সট ফাইলে মেটাডেটা সংরক্ষণ করতে FFmpeg পেতে হয় -f ffmetadata "[metadata filename here]"এবং তারপর ভালো কিছু দিয়ে আবার FFmpeg চলমান: -i "[metadata filename here]" -map_metadata 1 -c:a copy [destination mp3 file] id3v2_version 3 -write_id3v1 1। এটি কাজ করে তবে গন্তব্য ফাইলের প্রয়োজনীয়তাটি নোট করুন। দেখে মনে হচ্ছে এফএফম্পেগ কেবলমাত্র মেটাডেটা আমদানি করে যখন এটি ফাইলটি অনুলিপি করে যা খুব অপব্যয় প্রক্রিয়া বলে মনে হয়। মান পেতে FFprobe ব্যবহার এবং তারপর সঙ্গে অগ্রহণযোগ্য তাদের সেটিং --tt, --ta, --tl, --tnএবং --tgঅপশন ভাল কাজ করে; সমস্ত মেটাডেটা জায়গায় লেখা হয়েছে তাই নকল ফাইল তৈরি করা দরকার।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.