আমি কীভাবে একটি অডিও ফাইলকে একাধিকতে ভাগ করব?


36

আমি ভিডিওগুলির জন্য এমন কিছু সন্ধান পেয়েছি যা দেখে মনে হচ্ছে।

ffmpeg -i * -c:v libx264 -crf 22 -map 0 -segment_time 1 -g 1 -sc_threshold 0 -force_key_frames "expr:gte(t,n_forced*9)" -f segment output%03d.mp4

আমি এটি অডিও ফাইলের জন্য ব্যবহার করার চেষ্টা করেছি, তবে কেবলমাত্র প্রথম অডিও ফাইলটিতেই প্রকৃত অডিও রয়েছে, অন্যরা চুপ ছিল, এটি ব্যতীত এটি ভাল ছিল, এটি প্রতি সেকেন্ডের জন্য একটি নতুন অডিও ফাইল তৈরি করেছিল। অডিও ফাইলগুলি বা এই একই কাজ করতে পারে এমন অন্য কোনও আদেশ দিয়ে এই কাজটি করার জন্য কী কী পরিবর্তন করতে হবে তা কি কেউ জানেন?


যদি আপনি এটি করার অন্যান্য উপায় চান তবে দয়া করে আপনি কী অর্জন করতে চাইছেন তা আরও বিশদে ব্যাখ্যা করুন। ffmpeg cmdlines মনে রাখা শক্ত।

1
@s संभवnx আমি যেমন প্রশ্নে ব্যাখ্যা করেছি, একটি অডিও ফাইলের প্রতিটি সেকেন্ডকে নতুন অডিও ফাইলগুলিতে বিভক্ত করুন।
ডিসপ্লেনেম

উত্তর:


52

আমি যখন এমপি 3 ফাইলে চেষ্টা করেছিলাম তখন এটি আমার পক্ষে কাজ করে।

$ ffmpeg -i somefile.mp3 -f segment -segment_time 3 -c copy out%03d.mp3

কোথায় -segment_timeসময় পরিমাণ আপনি (সেকেন্ডে) প্রতিটি ফাইল প্রতি চাই।

তথ্যসূত্র


এমপি 3 এস এ কাজ করেছেন । আমার জন্য এম 4 বি এর ব্যর্থতা ব্যর্থ হয়েছে , "অবৈধ অডিও স্ট্রিম Ex ঠিক একটি এমপি 3 অডিও স্ট্রিম প্রয়োজন।"
vossad01

অবগতির জন্য, প্রতিস্থাপন mp3সঙ্গেm4a
মিখাইল

আমার কাছে ৪০ মিনিট ফাইল আছে যা আমি বললাম, 4 মিনিট, 6 মিনিট, 12 মিনিট, 8 মিনিট, 10 মিনিটের পরিবর্তে ইউনিফর্ম সাব-ফাইলগুলিতে বিভক্ত হয়ে যেতে চাই?
isosceleswheel

@ আইসোসেলসওহিল - এটি একবার দেখুন - unix.stackexchange.com/questions/94168/…
slm

এটি ওয়াভ ফাইলগুলির জন্যও কাজ করেছিল।
মারিও মাইরেলিস

19

বিভিন্ন দৈর্ঘ্যের সাথে একটি বড় অডিও ফাইলকে ট্র্যাকের সেটগুলিতে বিভক্ত করতে, আপনি নিম্নলিখিত কমান্ডটি ব্যবহার করতে পারেন:

# -to is the end time of the sub-file
ffmpeg -i BIG_FILE -acodec copy -ss START_TIME -to END_TIME LITTLE_FILE

উদাহরণস্বরূপ, আমি সূচনা, শেষ, নাম সহ এই টেক্সট ফাইলটি ব্যবহার করে ইনসেপশন অরিজিনাল সাউন্ডট্র্যাকের একক .opus ফাইলটিকে সাব-ফাইলগুলিতে বিভক্ত করেছিলাম:

00:00:00 00:01:11 01_half_remembered_dream
00:01:11 00:03:07 02_we_built_our_own_world
00:03:07 00:05:31 03_dream_is_collapsing
00:05:31 00:09:14 04_radical_notion
00:09:14 00:16:58 05_old_souls
00:16:58 00:19:22 06
00:19:22 00:24:16 07_mombasa
00:24:16 00:26:44 08_one_simple_idea
00:26:44 00:31:49 09_dream_within_a_dream
00:31:49 00:41:19 10_waiting_for_a_train
00:41:19 00:44:44 11_paradox
00:44:44 00:49:20 12_time

আমি এই ছোট awkপ্রোগ্রামটি পাঠ্য ফাইলটি পড়তে এবং ffmpegপ্রতিটি লাইন থেকে আদেশগুলি তৈরি করতে লিখেছিলাম :

{
    # make ffmpeg command string using sprintf
    cmd = sprintf("ffmpeg -i inception_ost.opus -acodec copy -ss %s -to %s %s.opus", $1, $2, $3)

    # execute ffmpeg command with awk's system function
    system(cmd)
}

এখানে pythonপ্রোগ্রামের আরও বিশদ সংস্করণ বলা হয় split.py, যেখানে এখন মূল ট্র্যাক ফাইল এবং পাঠ্য ফাইল উভয়ই সাব-ট্র্যাকগুলি নির্দিষ্ট করে কমান্ড লাইন থেকে পড়তে হবে:

import subprocess
import sys


def main():
    """split a music track into specified sub-tracks by calling ffmpeg from the shell"""

    # check command line for original file and track list file
    if len(sys.argv) != 3:
        print 'usage: split <original_track> <track_list>'
        exit(1)

    # record command line args
    original_track = sys.argv[1]
    track_list = sys.argv[2]

    # create a template of the ffmpeg call in advance
    cmd_string = 'ffmpeg -i {tr} -acodec copy -ss {st} -to {en} {nm}.opus'

    # read each line of the track list and split into start, end, name
    with open(track_list, 'r') as f:
        for line in f:
            # skip comment and empty lines
            if line.startswith('#') or len(line) <= 1:
                continue

            # create command string for a given track
            start, end, name = line.strip().split()
            command = cmd_string.format(tr=original_track, st=start, en=end, nm=name)

            # use subprocess to execute the command in the shell
            subprocess.call(command, shell=True)

    return None


if __name__ == '__main__':
    main()

ffmpegকমান্ড টেম্পলেটটি পরিবর্তন করে এবং / অথবা ট্র্যাক_লিস্ট ফাইলের প্রতিটি লাইনে আরও ক্ষেত্র যুক্ত করে আপনি সহজেই আরও বেশি জটিল কল আপ করতে পারেন ।


এটি চমৎকার, ! দয়া করে বলুন কীভাবে এটি পাইথন প্রোগ্রাম থেকে চালাবেন, অর্থাত্ আমি অডিওটি পড়তে চাই, এবং শুরু, শেষ, লেবেল সহ টীকাগুলি ফাইল। এবং তারপরে ফাইলের প্রতিটি লাইনের সাথে মাপের সাথে অডিওকে টুকরো টুকরো টুকরো করে।
kRazzy আর

2
@kRazzyR subprocess.call(command)হয় pythonথেকে এনালগ system(command)মধ্যে awkউভয় যা আপনি পাঠাতে অনুমতি ffmpegকমান্ড শেল। pythonআপনি এই পথে যেতে পারেন এমন একটি উপায়ের চিত্রিত একটি নমনীয় বাস্তবায়ন অন্তর্ভুক্ত করার জন্য আমি আমার পোস্ট সম্পাদনা করেছি ।
isosceleswheel

1
আমার অভিজ্ঞতাতে # 2 ট্র্যাকের শুরুর সময় ট্র্যাক # 1 এর শেষ সময়ের সমান হওয়া উচিত। এটি হ'ল, আপনার উদাহরণের সময়গুলি প্রতিটি ট্র্যাকের মধ্যে একটি সেকেন্ড এড়িয়ে যাবে।
টিম স্মিথ

1
এখানে একটি কমপ্যাক্ট বাশ / zsh সংস্করণ। প্রয়োজন অনুসারে সময়গুলি সম্পাদনা করুন এবং তারপরে echo কমান্ডগুলি চালানোর জন্য শব্দটি সরিয়ে ফেলুন । source="source audio file.m4a"; i=0; t1=0:00; for end_time in 1:24 5:40 14:48 19:33 35:11 40:00 46:08 51:58 ''; do i=$((i+1)); t0=$t1 t1=$end_time; echo ffmpeg -i "$source" -acodec copy -ss $t0 ${t1:+-to} $t1 $(printf "track%02d.%s" $i ${source##*.}); done
টিম স্মিথ

@ টিমস্মিথ এটি ধরার জন্য ধন্যবাদ, আমি উপরে একটি সম্পাদনা যুক্ত করেছি। আপনার প্লেয়ারের উপর নির্ভর করে এখনও ট্র্যাকগুলির মধ্যে একটি ছোট হিচাপ থাকতে পারে তবে এটি অবশ্যই 1s কেটে দেওয়ার চেয়ে আরও ভাল মনে হচ্ছে।
isosceleswheel

3

নিম্নলিখিত লাইনটি 30 সেকেন্ড সময়কাল সহ প্রতিটি অডিও ফাইলকে একাধিক ফাইলে বিভক্ত করবে।

ffmpeg -i file.wav -f segment -segment_time 30 -c copy parts/output%09d.wav

আপনার যে কোনও সংখ্যায় 30 (যা সেকেন্ডের সংখ্যা) পরিবর্তন করুন।


1

এসএমএল এর উত্তর :

ffmpeg -i somefile.mp3  -f segment -segment_time 3 -c copy out%03d.mp3

-map 0যোগ করা আমার সাথে কাজ করবে না :

ffmpeg -i somefile.mp3 -map 0 -f segment -segment_time 3 -c copy out%03d.mp3

ম্যাপিংটি দুর্দান্ত কাজ করে তবে এম্বেড থাকা যেকোনো ছবি সরিয়ে ফেলার জন্য -vn যুক্ত করে, বা এটি প্রতিটি বিভাগের জন্য চিত্রটি পুনরায় তৈরি করার চেষ্টা করবে, (স্লোওউউউউব)।
ক্রিস রেড

1

প্রদত্ত সমাধানটি আমার পক্ষে কার্যকর হয়নি। আমার বিশ্বাস ffmpegএটি আমার সিস্টেমে পুরানো সংস্করণের কারণে হতে পারে ।
যাই হোক না কেন, আমি একটি সমাধান সরবরাহ করতে চেয়েছিলাম যা আমার পক্ষে কাজ করে। আপনি চাইলে টাইমারগুলিও কাস্টমাইজ করতে পারেন যাতে অডিওতে ওভারল্যাপিংয়ের অনুমতি দেওয়া হয়।

Output file #0 does not contain any stream

ffmpeg -i your_audio_file.mp3 -acodec copy -t 00:00:30 -ss 00:00:00 split_audio_file.mp3

আপনার অডিও ফাইলগুলি 30 সেকেন্ডের ইনক্রিমেন্টে বিভক্ত করুন


একটি নতুন প্রশ্ন ক্রমযুক্ত হবে, কারণ এটি ওপির প্রশ্নের উত্তর দেয় না!
জর্জ উদোসেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.