আমি কীভাবে এফএফপিপিগ ব্যবহার করে কোনও ভিডিও থেকে একাধিক বিভাগ সরিয়ে ফেলতে পারি?


51

আমি এফএফএমপিগ ব্যবহার করে একটি ভিডিওর কয়েকটি বিভাগ মুছে ফেলার চেষ্টা করছি।

উদাহরণস্বরূপ, কল করুন যদি আপনি টেলিভিশনে কোনও অনুষ্ঠান রেকর্ড করেন এবং বিজ্ঞাপনগুলি কাটাতে চান। এটি একটি জিইউআই ভিডিও-সম্পাদক সহ সহজ; আপনি সরাতে হবে এবং প্রতিটি মুছে ফেলার জন্য ক্লিপটির শুরু এবং শেষ চিহ্নিত করুন এবং মুছুন নির্বাচন করুন। আমি এফএফপিপেইগের সাথে কমান্ড-লাইন থেকে একই জিনিসটি করার চেষ্টা করছি।

আমি জানি যে কীভাবে একটি নতুন ভিডিওতে একটি একক বিভাগ কাটা যায়:

ffmpeg -i input.avi -ss 00:00:20 -t 00:00:05 -map 0 -codec copy output.avi

এটি একটি পাঁচ-সেকেন্ডের ক্লিপটি কেটে ফেলে এবং এটি একটি নতুন ভিডিও ফাইল হিসাবে সংরক্ষণ করে, তবে আমি কীভাবে বিপরীতটি করতে পারি এবং নির্দিষ্ট ক্লিপ ছাড়াই পুরো ভিডিওটি সংরক্ষণ করতে পারি এবং আমি কীভাবে একাধিক ক্লিপগুলি মুছে ফেলার জন্য নির্দিষ্ট করতে পারি?

উদাহরণস্বরূপ, যদি আমার ভিডিওটি এবিসিডিইএফজি দ্বারা প্রতিনিধিত্ব করা যায় তবে আমি একটি নতুন ভিডিও তৈরি করতে চাই যাতে এসিডিএফজি সমন্বিত থাকে।



1
এটি আমি যা জিজ্ঞাসা করছি তা নয়, আমি এটি একটি সমস্ত "পর্ব" এ পেতে চাই তবে এটির মূল ভিডিও থেকে আলাদা বিভাগ থাকবে।
মাটিয়াস

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

1
@ সাইনটেক আপনার উত্তরের জন্য ধন্যবাদ। আমি অন্য ভিডিওগুলির ক্লিপগুলির সাথে তাদের একত্রিত করতে চাই না। আমি ভিডিওগুলি থেকে কিছু অংশ সরাতে চাই। উদাহরণস্বরূপ, যদি আমার ভিডিওটি এবিসিডিইএফজি দ্বারা প্রতিনিধিত্ব করা যায় তবে আমি একটি নতুন ভিডিও তৈরি করতে চাই যাতে এসিডিএফজি সমন্বিত থাকে।
মাটিয়াস

@ সিনিটেক এটি আমার ছিল না, টোগই নিশ্চয় ভুল বুঝতে পেরেছিলেন।
মাটিয়াস

উত্তর:


47

ঠিক আছে, আপনি এখনও তার জন্য trimফিল্টারটি ব্যবহার করতে পারেন । এখানে একটি উদাহরণ দেওয়া আছে, ধরে নেওয়া যাক আপনি 30-40 সেকেন্ড (10 সেকেন্ড) এবং 50-80 সেকেন্ড (30 সেকেন্ড) বিভাগগুলি কাটাতে চান:

ffmpeg -i in.ts -filter_complex \
"[0:v]trim=duration=30[a]; \
 [0:v]trim=start=40:end=50,setpts=PTS-STARTPTS[b]; \
 [a][b]concat[c]; \
 [0:v]trim=start=80,setpts=PTS-STARTPTS[d]; \
 [c][d]concat[out1]" -map [out1] out.ts

আমি এখানে কি করেছি? আমি প্রথম 30 সেকেন্ড, 40-50 সেকেন্ড এবং 80 সেকেন্ডটি শেষ করতে ছাঁটা করেছি এবং তারপরে এগুলি ফিল্টারটির out1সাথে সংযুক্ত করে concat

সেটপটস সম্পর্কে: আমাদের এটি দরকার কারণ ট্রিম চিত্র প্রদর্শনের সময়কে সংশোধন করে না এবং যখন আমরা 10 সেকেন্ড ডিকোডার কাউন্টারটি কাটিয়েছি তখন এটি 10 ​​সেকেন্ডের জন্য কোনও ফ্রেম দেখতে পাবে না।

আপনি যদি অডিওও পেতে চান তবে অডিও স্ট্রিমগুলির জন্য আপনাকে একই কাজ করতে হবে। সুতরাং আদেশটি হওয়া উচিত:

ffmpeg -i utv.ts -filter_complex \
"[0:v]trim=duration=30[av];[0:a]atrim=duration=30[aa];\
 [0:v]trim=start=40:end=50,setpts=PTS-STARTPTS[bv];\
 [0:a]atrim=start=40:end=50,asetpts=PTS-STARTPTS[ba];\
 [av][bv]concat[cv];[aa][ba]concat=v=0:a=1[ca];\
 [0:v]trim=start=80,setpts=PTS-STARTPTS[dv];\
 [0:a]atrim=start=80,asetpts=PTS-STARTPTS[da];\
 [cv][dv]concat[outv];[ca][da]concat=v=0:a=1[outa]" -map [outv] -map [outa] out.ts

ভাল একটা! আমাদের সেটপটসের দরকার কেন? আপনি ব্যাখ্যা যোগ করতে পারেন?
রাজীব

ঠিক আছে, আপডেট উত্তর দেখুন।
ptQa

4
+1 এটি উত্তর হিসাবে নির্বাচন করা উচিত। এটি "একাধিক বিভাগ" এর জন্য আরও উপযুক্ত এবং একের পর এক একাধিক কমান্ড সম্পাদনের প্রয়োজনীয়তা সরিয়ে দেয়। (যদি না অন্য উপায় আরও গতির দক্ষ হয়)
ননোসোস

1
আপনি যখন ফ্রেমগুলি এড়িয়ে যাচ্ছেন তখন আপনি কীভাবে সাবটাইটেল ডেটা বজায় রাখবেন?
অ্যান্ড্রু Scagnelli

1
এটা খুব অমানবিক।
গোলাপট

15

আমি পিটিকিউ'র সমাধানটি কখনও কাজ করতে পারি না, বেশিরভাগ কারণ আমি ফিল্টারগুলি থেকে ত্রুটিগুলি কী বোঝায় বা সেগুলি কীভাবে ঠিক করতে হয় তা কখনই বুঝতে পারি না। আমার সমাধানটি কিছুটা ক্লোনিয়ার বলে মনে হচ্ছে কারণ এটি কোনও বিশৃঙ্খলার পিছনে ফেলে যেতে পারে, তবে আপনি যদি এটি কোনও স্ক্রিপ্টে ফেলে দিচ্ছেন তবে ক্লিন আপটি স্বয়ংক্রিয়ভাবে তৈরি হতে পারে। আমি এই পদ্ধতিকেও পছন্দ করি কারণ যদি পদক্ষেপ 4 এ কিছু ভুল হয়ে যায় তবে আপনি সম্পূর্ণ পদক্ষেপ 1-3 দিয়ে শেষ করেন তাই ত্রুটিগুলি থেকে পুনরুদ্ধার করা একটু বেশি দক্ষ।

মৌলিক কৌশলটি ব্যবহার করছে -tএবং -ssপ্রতিটি বিভাগের ভিডিও আপনি চান তা পেতে, তারপরে আপনার চূড়ান্ত সংস্করণের জন্য সমস্ত অংশ একসাথে যোগদান করুন।

বলুন যে আপনার প্রতি 5 সেকেন্ড দীর্ঘ 6 টি বিভাগ রয়েছে এবং আপনি এ (0-5 সেকেন্ড), সি (10-15 সেকেন্ড) এবং ই চান (20-25 সেকেন্ড) আপনি এটি করতে চান:

ffmpeg -i abcdef.tvshow -t 5 a.tvshow -ss 10 -t 5 c.tvshow -ss 20 -t 5 e.tvshow

অথবা

ffmpeg -i abcdef.tvshow -t 0:00:05 a.tvshow -ss 0:00:10 -t 0:00:05 c.tvshow -ss 0:00:20 -t 0:00:05 e.tvshow

এটি ফাইলগুলি a.tvshow, c.tvshow এবং e.tvshow তৈরি করবে। -tবলেছেন কতদিন প্রতিটি ক্লিপ, তাই যদি গ 30 সেকেন্ড দীর্ঘ 30 বা 0:00:30 মধ্যে পাস করতে পারে। -ssবিকল্প কতদূর উৎস ভিডিওতে এড়িয়ে যেতে চাইলে এটা সবসময় ফাইল শুরুর আপেক্ষিক তাই বলছেন।

তারপরে একবার আপনার কাছে একগুচ্ছ ভিডিও ফাইল এনে একটি ফাইল ace-files.txtতৈরি করব:

file 'a.tvshow'
file 'c.tvshow'
file 'e.tvshow'

শুরুতে "ফাইল" এবং তার পরে পালানো ফাইলের নামটি নোট করুন।

তারপরে আদেশ:

ffmpeg -f concat -i ace-files.txt -c copy ace.tvshow

এটি সমস্ত ফাইলকে abe-files.txtএকত্রে যুক্ত করে, তাদের অডিও এবং ভিডিও কোডেকগুলি অনুলিপি করে এমন একটি ফাইল তৈরি করে ace.tvshowযা কেবল বিভাগ a, c এবং e হওয়া উচিত। তারপর শুধু মুছতে মনে রাখবেন ace-files.txt, a.tvshow, c.tvshowএবং e.tvshow

দাবি অস্বীকার : আমার কীভাবে (ইন) দক্ষতার সাথে অন্য পদ্ধতির সাথে তুলনা করা যায় ffmpegতা আমার ধারণা নেই তবে আমার উদ্দেশ্যে এটি আরও ভাল কাজ করে। আশা করি এটি কাউকে সাহায্য করবে।


4
এটি আমার হিসাবে নতুনদের জন্য খুব বোধগম্য, ধন্যবাদ
জুয়ানপাস্তাস

4
দ্রষ্টব্য আপনি যদি ব্যাশ ব্যবহার করছেন তবে আপনি ফাইলটি তৈরি করতে এড়াতে পারেন ( ace-files.txtউদাহরণস্বরূপ) এর সাথে:ffmpeg -f concat -i <(printf "file '%s'\n" $(pwd)/prefix_*.tvshow) -c copy output.tvshow
বুফ

এটি সত্যই সহায়ক ছিল তবে ফাইল নামগুলির কাছ থেকে আমাকে একক উদ্ধৃতি সরিয়ে ফেলতে হয়েছিল বা এটি কার্যকর হয়নি।
টেচেমোর

ভিডিওগুলিকে সংমিশ্রিত করার সময়, একটি ছোট কালো ভিডিও এবং প্রায় 25 মিমি মধ্যে তাদের মধ্যে নিরব অডিও থাকে। কোন ধারণা থেকে মুক্তি পেতে পারেন?
অ্যান্টোনিও বোনিফাটি 'ফারম্বয়'

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

5

রেকর্ড করা টিভি সম্পাদনা দ্রুত করার জন্য আমি একটি স্ক্রিপ্ট তৈরি করেছি। স্ক্রিপ্ট আপনাকে সেগমেন্টগুলির শুরু এবং শেষ সময়গুলির জন্য জিজ্ঞাসা করে এবং সেগুলি ফাইলে বিভক্ত করে। এটি আপনাকে বিকল্প দেয়, আপনি এটি করতে পারেন:

  • এক বা একাধিক বিভাগ নিন।
  • আপনি এক ফলাফল ফাইলের মধ্যে বিভাগগুলি একত্রিত করতে পারেন।
  • যোগদানের পরে আপনি পার্ট ফাইলগুলি রাখতে বা মুছতে পারেন।
  • আপনি মূল ফাইলটি রাখতে পারেন বা এটি আপনার নতুন ফাইলের সাথে প্রতিস্থাপন করতে পারেন।

এটির কার্যক্রমে ভিডিও: এখানে

আমার সম্পর্কে আপনি কী মনে করেন জানি।

 #!/bin/bash
/bin/date >>segmenter.log

function segment (){
while true; do
    echo "Would you like to cut out a segment ?"
    echo -e "1) Yes\n2) No\n3) Quit"
    read CHOICE
    if [ "$CHOICE" == "3" ]; then
        exit
    elif [ "$CHOICE" == "2" ]; then
        clear
        break
    elif [ "$CHOICE" == "1" ]; then
        clear
        ((segments++))
        echo "What time does segment $segments start ?"
        read SEGSTART
        clear
        echo -e "Segment $segments start set to $SEGSTART\n"  
        echo "What time does segment $segments end ?"
        read SEGEND
        clear
        echo -e "Segment $segments end set to $SEGEND\n"
        break
    else
        clear
        echo -e "Bad option"
        segment "$segments"
    fi
done
if [ "$CHOICE" == "1" ]; then
    echo "Cutting file $file video segment $segments starting at $SEGSTART and ending at $SEGEND"
    ffmpeg -i "$file" -ss $SEGSTART -to  $SEGEND -map 0:0 -map 0:1 -c:a copy -c:v copy  "$filename-part$segments.$extension"  >> segmenter.log 2>&1
    clear
    echo -e "Cut file $filename-part$segments.$extension starting at $SEGSTART and ending at $SEGEND\n"                             
    segment "$segments"
fi
}

file="$1"
filename="${file%.*}"
extension="${file##*.}"
clear
segments=0
segment "$segments"
clear
if (("$segments"==1)); then
mv $filename"-part1."$extension "$filename-segmented.$extension"
elif (("$segments">1)); then
echo "Would you like to join the segments into one file ?"      
       OPTIONS="Yes No Quit"
       select opt in $OPTIONS; do
       clear
        if [ "$opt" == "Quit" ]; then
            exit
        elif [ "$opt" == "Yes" ]; then
            clear
            echo "Joining segments"
            ffmpeg -f concat -i <(for f in $filename"-part"*$extension;         do echo "file '$(pwd)/$f'"; done) -c:a copy -c:v copy "$filename-segmented.$extension" >>         segmenter.log 2>&1
            clear
            echo "Would you like to delete the part files ?"
            select opt in $OPTIONS; do
            clear
            if [ "$opt" == "Quit" ]; then
                exit
            elif [ "$opt" == "Yes" ]; then
                for f in $filename"-part"*$extension; do rm $f; done
                break
            elif [ "$opt" == "No" ]; then
                break
            else
                clear
                echo -e "Bad option\n"
            fi
            done
            break
        clear
        elif [ "$opt" == "No" ]; then
            exit
        else
            clear
            echo -e "Bad option\n"
        fi
    done
fi
echo "Would you like to replace the original file with the result of your changes ?"
OPTIONS="Yes No Quit"
select opt in $OPTIONS; do
    clear
    if [ "$opt" == "Quit" ]; then
        exit
    elif [ "$opt" == "Yes" ]; then
        rm $file
        mv "$filename-segmented.$extension" $file
        break
    elif [ "$opt" == "No" ]; then
        break
    else
        clear
        echo -e "Bad option\n"
    fi
done

2
এই স্ক্রিপ্ট দুর্দান্ত! শুধু এক পরিমার্জন যেহেতু আপনি সংযুক্তকরণের জন্য পরম পাথ ব্যবহার করছেন: অ্যাড safe=0, অর্থাত্ ffmpeg -f concat -safe 0 -i ...দেখুন ffmpeg.org/ffmpeg-all.html#Options-36
pkSML

2

যদিও পিটিকিউএ প্রদত্ত উত্তরটি কাজ করে বলে মনে হচ্ছে, আমি অন্য একটি সমাধান তৈরি করেছি যা সূক্ষ্মভাবে কাজ করার প্রবণতা অর্জন করেছে।

মূলত, আমি যা করি তা হ'ল মূল ফলাফলের প্রতিটি অংশের জন্য একটি ভিডিও কাটা যা আমি আমার ফলাফলটিতে অন্তর্ভুক্ত করতে চাই। পরে, আমি এখানে কনক্যাট ডেমাক্সারের সাথে ব্যাখ্যা করে তাদের সাথে সম্মতি জানাই ।

সমাধানটি একই রকম যে আমি প্রথমে চেষ্টা করেছি এবং সিঙ্ক সমস্যাগুলি উপস্থাপন করেছি। আমি আলাদাভাবে ভিডিও তৈরি করার সময় কমান্ডটি হ'ল কমান্ডটি -avoid_negative_ts 1 । এই সমাধানের সাথে সিঙ্কের সমস্যাগুলি অদৃশ্য হয়ে যায়।


1

পিটিকিউ'র পদ্ধতির অনুসরণে যারা সমস্যায় পড়েছেন তাদের জন্য আরও কিছুটা সহজ উপায় আছে stream পথে প্রতিটি পদক্ষেপে সংক্ষিপ্ত না হয়ে কেবল এগুলি সব শেষে করুন।

প্রতিটি ইনপুট জন্য, A / V জোড় সংজ্ঞায়িত করুন:

//Input1:
[0:v]trim=start=10:end=20,setpts=PTS-STARTPTS,format=yuv420p[0v];
[0:a]atrim=start=10:end=10,asetpts=PTS-STARTPTS[0a];
//Input2:
[0:v]trim=start=30:end=40,setpts=PTS-STARTPTS,format=yuv420p[1v];
[0:a]atrim=start=30:end=40,asetpts=PTS-STARTPTS[1a];
//Input3:
[0:v]trim=start=30:end=40,setpts=PTS-STARTPTS,format=yuv420p[2v];
[0:a]atrim=start=30:end=40,asetpts=PTS-STARTPTS[2a];

আপনার প্রয়োজন অনুসারে যতগুলি সংখ্যক সংজ্ঞা দিন, তারপরে সেগুলিকে এক পাসে একত্র করুন, যেখানে এন = মোট ইনপুট গণনা।

[0v][0a][1v][1a][2v][2a]concat=n=3:v=1:a=1[outv][outa] -map [outv] -map [outa] out.mp4

এটি সহজেই একটি লুপে নির্মিত যেতে পারে।

একটি সম্পূর্ণ কমান্ড যা 2 ইনপুট ব্যবহার করে তা দেখতে এরকম হতে পারে:

 -y -i in.mp4 -filter_complex 
[0:v]trim=start=10.0:end=15.0,setpts=PTS-STARTPTS,format=yuv420p[0v];
[0:a]atrim=start=10.0:end=15.0,asetpts=PTS-STARTPTS[0a];
[0:v]trim=start=65.0:end=70.0,setpts=PTS-STARTPTS,format=yuv420p[1v];
[0:a]atrim=start=65.0:end=70.0,asetpts=PTS-STARTPTS[1a];[0v][0a][1v]
[1a]concat=n=2:v=1:a=1[outv][outa] -map [outv] -map [outa] out.mp4
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.