FFmpeg ব্যবহার করে দুটি এমপি 4 ফাইল কীভাবে সংযুক্ত করতে হয়?


443

আমি ffmpeg ব্যবহার করে দুটি এমপি 4 ফাইল সংযুক্ত করার চেষ্টা করছি। আমার এটিকে একটি স্বয়ংক্রিয় প্রক্রিয়া হওয়া দরকার তাই আমি এফএফএমপিগ কেন বেছে নিয়েছি। আমি দুটি ফাইলকে .ts ফাইলগুলিতে রূপান্তর করছি এবং তারপরে তাদের সাথে সংযুক্ত করছি এবং তারপরে সেই সমাপ্ত .ts ফাইলটিকে এনকোড দেওয়ার চেষ্টা করছি। ফাইলগুলি h264 এবং এ্যাক এনকোডযুক্ত এবং আমি মানেরটি একই বা যতটা সম্ভব মূলের কাছাকাছি রাখার প্রত্যাশা করছি।

ffmpeg -i part1.mp4 -vcodec copy -vbsf h264_mp4toannexb -acodec copy part1.ts
ffmpeg -i part2.mp4 -vcodec copy -vbsf h264_mp4toannexb -acodec copy part2.ts
cat part1.ts part2.ts > parts.ts
ffmpeg -y -i parts.ts -acodec copy -ar 44100 -ab 96k -coder ac -vbsf h264_mp4toannexb parts.mp4

দুর্ভাগ্যক্রমে আমি নীচের ত্রুটি বার্তাটি এনকোডিংয়ের সময় ffmpeg থেকে ফিরে আসছি:

[h264 @ 0x1012600]sps_id out of range
[h264 @ 0x1012600]non-existing SPS 0 referenced in buffering period
[h264 @ 0x1012600]sps_id out of range
[h264 @ 0x1012600]non-existing SPS 0 referenced in buffering period
[NULL @ 0x101d600]error, non monotone timestamps 13779431 >= 13779431kbits/s    
av_interleaved_write_frame(): Error while opening file

এটি এনকোডিংয়ের মধ্য দিয়ে প্রায় অর্ধেকটি ঘটে যা আমাকে মনে করে যে আপনি দুটি .ts ফাইল একসাথে সংগ্রহ করতে পারবেন না এবং এটি কাজ করতে পারবেন।

উত্তর:


786

এফএফম্পেগের তিনটি কনটেস্টেশন পদ্ধতি রয়েছে:

1. কনক্যাট ভিডিও ফিল্টার

আপনার ইনপুটগুলির একই পরামিতিগুলি (প্রস্থ, উচ্চতা ইত্যাদি) না থাকলে বা একই ফর্ম্যাট / কোডেকগুলি না থাকলে বা আপনি যদি কোনও ফিল্টারিং করতে চান তবে এই পদ্ধতিটি ব্যবহার করুন। (আপনি কেবলমাত্র ইনপুটগুলিকে পুনরায় এনকোড করতে পারেন যা মেলে না তাই তারা একই কোডেক এবং অন্যান্য প্যারামিটারগুলি ভাগ করে, তবে অন্যান্য ইনপুটগুলিকে পুনরায় এনকোডিং এড়ানোর জন্য কনক্যাট ডেমাক্সার ব্যবহার করুন)।

ffmpeg -i opening.mkv -i episode.mkv -i ending.mkv \
       -filter_complex "[0:v] [0:a] [1:v] [1:a] [2:v] [2:a] 
                        concat=n=3:v=1:a=1 [v] [a]" \
       -map "[v]" -map "[a]" output.mkv

নোট করুন যে এই পদ্ধতিটি পুনরায় এনকোড সম্পাদন করে।

2. কনক্যাট ডেমাক্সার

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

$ cat mylist.txt
file '/path/to/file1'
file '/path/to/file2'
file '/path/to/file3'

$ ffmpeg -f concat -safe 0 -i mylist.txt -c copy output.mp4

উইন্ডোজ জন্য :

(echo file 'first file.mp4' & echo file 'second file.mp4' )>list.txt
ffmpeg -safe 0 -f concat -i list.txt -c copy output.mp4

৩. কনক্যাট প্রোটোকল

ফাইল স্তর স্তরের কনটেনটেশন (এমপিইজি -1, এমপিইজি -2 পিএস, ডিভি) সমর্থন করে এমন ফর্ম্যাটগুলির সাথে এই পদ্ধতিটি ব্যবহার করুন। এমপি 4 দিয়ে ব্যবহার করবেন না

ffmpeg -i "concat:input1|input2" -codec copy output.mkv

এই ফর্ম্যাটগুলির প্রকৃতি এবং এই পদ্ধতির দ্বারা সম্পাদিত সরল বর্ণনামূলক কারণে এই পদ্ধতিটি এমপি 4 সহ অনেকগুলি বিন্যাসের জন্য কাজ করে না।


কোন পদ্ধতিটি ব্যবহার করবেন তা নিয়ে যদি সন্দেহ হয় তবে কনক্যাট ডেমাক্সারটি ব্যবহার করে দেখুন।

এছাড়াও দেখুন


3
উইন্ডোজ কমান্ড প্রম্পট এস্কেপ অক্ষর ^; আমি উদ্ধৃতি চিহ্নগুলি নিয়েও সমস্যায় পড়েছি তাই এটি হয়ে গেছে: ffmpeg -i concat: ইনপুট 1 input | ইনপুট 2-কোডেক অনুলিপি
ইউজার 423930

1
সহায়ক উত্তর। এবং আমি যখন এই প্রকরণটি পড়ি তখন এটি আমার কাছে আরও তাত্পর্যপূর্ণ হয়েছিল: superuser.com/a/607384/74576
রায়ান

3
কনক্যাট ডেমাক্সার ভিডিওটির জন্য কাজ করে তবে আমি অডিও হারাচ্ছি
Loïc

24
অনেলিয়ার ব্যবহারের জন্য: ffmpeg -safe 0 -f concat -i <(find . -type f -name '*' -printf "file '$PWD/%p'\n" | sort) -c copy output.mkv( এমকেভি এমপি 4 এর চেয়ে বেশি কোডেক গ্রহণ করে তবে আপনি এমপি 4 দিয়েও চেষ্টা করে দেখতে পারেন)। এটি -safe 0হ'ল সাম্প্রতিক ffmpeg সংস্করণগুলি অনিরাপদ ফাইলের নাম সম্পর্কে অভিযোগ করছে এবং এটি -type fকেবলমাত্র ফাইল তালিকা করার জন্য। আমি | sortবর্ণগুলিতে ফাইলগুলি বাছাই করতে যুক্ত করেছি ; কারণ findফাইল সিস্টেমে সেভ করা হিসাবে সেগুলি পাঠ করে। সাদা স্থান সহ ফাইলগুলির জন্যও কাজ করে।
এরিক

1
আমার জন্য, উইন্ডোজে, ডবল উদ্ধৃতি চিহ্ন (আপনার উদাহরণে একক পরিবর্তে) কাজ: ffmpeg -i "concat:input1|input2" -codec copy output। পাইপের চরিত্রটি এড়ানোর দরকার নেই।
শোভলেট

83

এমপি 4 ফাইলের জন্য

জন্য .mp4 ফাইল (যা আমি DailyMotion.com থেকে প্রাপ্ত: 50 মিনিট টিভি পর্ব, শুধুমাত্র তিনটি অংশ তিন .mp4 ভিডিও ফাইল হিসেবে ডাউনলোড করা,) নিম্নলিখিত জন্য একটি কার্যকর সমাধান ছিল উইন্ডোজ 7 , এবং নেই না পুনরায় এনকোডিং জড়িত নথি পত্র.

আমি ফাইলগুলির নামকরণ করেছি ( file1.mp4 , file2.mp4 , file3.mp4 হিসাবে ) যে অংশগুলি সম্পূর্ণ টিভি পর্ব দেখার জন্য সঠিক ক্রমে ছিল।

তারপরে আমি নীচের বিষয়বস্তু সহ একটি সাধারণ ব্যাচ ফাইল (কনক্যাট.ব্যাট) তৈরি করেছি:

:: Create File List
echo file file1.mp4 >  mylist.txt 
echo file file2.mp4 >> mylist.txt
echo file file3.mp4 >> mylist.txt

:: Concatenate Files
ffmpeg -f concat -i mylist.txt -c copy output.mp4

ব্যাচ ফাইল , এবং ffmpeg.exe , যেন উভয়েই একই ফোল্ডারে রেখে দেওয়া যেতে হিসাবে .mp4 ফাইল যোগদান করতে হবে। তারপরে ব্যাচের ফাইলটি চালান। এটি চালাতে সাধারণত দশ সেকেন্ডেরও কম সময় নেবে।

সংযোজন (2018/10/21) -

আপনি যা সন্ধান করছেন তা যদি বর্তমান ফোল্ডারে সমস্ত এমপি 4 ফাইলগুলি পুনরায় টাইপ না করে নির্দিষ্ট করার জন্য একটি পদ্ধতি হয় তবে এর পরিবর্তে আপনার উইন্ডোজ ব্যাচ ফাইলে চেষ্টা করুন ( বিকল্পটি অবশ্যই নিরাপদ 0 অন্তর্ভুক্ত করতে হবে ):

:: Create File List
for %%i in (*.mp4) do echo file '%%i'>> mylist.txt

:: Concatenate Files
ffmpeg -f concat -safe 0 -i mylist.txt -c copy output.mp4

এটি একটি ব্যাচের ফাইলে উইন্ডোজ 7 এ কাজ করে। কমান্ড লাইনে এটি ব্যবহার করার চেষ্টা করবেন না , কারণ এটি কেবল একটি ব্যাচ ফাইলে কাজ করে!


5
এতদূর সহজ সমাধান।
1934286

এটি সেরা এবং সহজ উত্তর হওয়া উচিত। ভাল কাজ, আমার ভাই। আপনি আমার দিন বাঁচিয়েছেন।
ডিসানিয়াজজেড

এটি একটি ভাল সমাধান তবে একটি ব্যাচের ফাইল সম্পর্কে কথা বলাই এই শব্দটিকে আদিম করে তোলে (যেমন এটি ব্যাচে করা হয়েছিল), এবং এর চেয়ে জটিল আরও (কারণ একটি ব্যাচের ফাইল সম্পূর্ণ অপ্রয়োজনীয়)। এটা অনেক পরিস্কার হলে আপনি কেবল দেন C:\blah>type mylist.txt<ENTER>(সুতরাং তারা যে ফাইলের বিষয়বস্তু দেখুন) তারপর ffmpeg -f concat -i mylist.txt -c copy output.mp4<ENTER> এছাড়াও আপনি একটি রেফারেন্স অন্তর্ভুক্ত করা উচিত trac.ffmpeg.org/wiki/Concatenate (যে রেফারেন্স এমনকি একই ফাইলের নাম, mylist.txt ব্যবহার করে)
barlop

এটি -iপ্যারামিটারের জন্য ফাইলগুলির দীর্ঘ তালিকাতে টাইপ করা থেকে বাঁচায় এটি একটি খুব ভাল সমাধান । লিনাক্সে আমি এটি করেছি: ls -1 P1041*.mp4 | sed s/"P"/" file P"/g > mylist.txtযা একটি ব্যাচের স্ক্রিপ্ট কোডিংয়ের চেয়েও শীতল। যাইহোক, -c copyখুব দ্রুত সঞ্চালিত হয় (যা সম্পর্কে আমি জানতাম না) এবং এটি এই উত্তরটির আসল যাদু।
Wgrgspaß

1
আমার এমপি 4 ফাইলগুলির সাথে, ffmpeg v3.2.2 ব্যবহার করে কোনও ম্যাকের উপর আপনার কনক্যাট কোড চালানোর পরে আউটপুট ফাইলে কোনও অডিও নেই।
কাকিয়ো

60

মধ্যবর্তী ফাইলগুলির প্রয়োজন ছাড়াই এটি করার জন্য একটি দ্রুত (1 মিনিটেরও কম সময় নেয়) এবং লসলেস উপায়'s

ls Movie_Part_1.mp4 Movie_Part_2.mp4 | \
perl -ne 'print "file $_"' | \
ffmpeg -f concat -i - -c copy Movie_Joined.mp4

"পার্স" -এর সাথে যুক্ত হওয়ার জন্য ফাইলগুলি অন্তর্ভুক্ত রয়েছে "পার্ল" একটি পাইপের মধ্যে ফ্লাইয়ের উপসংহার ফাইল তৈরি করে "-i -" অংশটি ffmpeg কে পাইপ থেকে পড়তে বলে

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


2
এটি ওএসএক্সে করেছে এবং এটি দুর্দান্ত কাজ করেছে! অল্প প্রয়োজনের সাথে দুর্দান্ত, দ্রুত ক্ষতির সমাধান
জিএম লুসিড

1
সাদা ls Movie_Part_1.mp4 Movie_Part_2.mp4 | perl -ne '$_ =~ s/\n$//; print "file '"'"'$_'"'"'\n"' | ffmpeg -f concat -i - -c copy Movie_Joined.mp4
স্থানযুক্ত

4
ls * | perl -ne 'print "file $_"' | ffmpeg -f concat -i - -c copy Movie_Joined.mp4আপনার ফাইলগুলি সুনামযুক্ত এবং যথাযথভাবে করা থাকলে আপনি এটি করতেও পারেন । ওএস এক্স-এ আমার জন্য দুর্দান্ত কাজ করেছিল, আমি যা চেয়েছিলাম ঠিক তাই।
natebeaty

3
লিনাক্সে আমি এই অনেলাইনারটি ব্যবহার করেছি: ffmpeg -safe 0 -f concat -i <(find . -type f -name '*' -printf "file '$PWD/%p'\n" | sort) -c copy output.mkv( এমকেভি এমপিপি 4 এর চেয়ে বেশি কোডেক গ্রহণ করে তবে আপনি এমপি 4 দিয়েও চেষ্টা করতে পারেন)। এটি -safe 0হ'ল সাম্প্রতিক ffmpeg সংস্করণগুলি অনিরাপদ ফাইলের নাম সম্পর্কে অভিযোগ করছে এবং এটি -type fকেবলমাত্র ফাইল তালিকা করার জন্য। আমি | sortবর্ণগুলিতে ফাইলগুলি বাছাই করতে যুক্ত করেছি ; কারণ findফাইল সিস্টেমে সেভ করা হিসাবে সেগুলি পাঠ করে। সাদা স্থান সহ ফাইলগুলির জন্যও কাজ করে।
এরিক

13
এটি তৈরি করতে আমাকে এই প্যারামিটারটি যুক্ত করতে ffmpegহয়েছিল:-protocol_whitelist file,tcp,http,pipe
বেনজেজ

44

এমপি 4 ফাইলের জন্য:

যদি এগুলি একই রকম না হয় (100% একই কোডেক, একই রেজোলিউশন, একই ধরণের) এমপি 4 ফাইল, তবে আপনাকে প্রথমে তাদের মধ্যবর্তী স্ট্রিমগুলিতে ট্রান্স-কোড করতে হবে:

ffmpeg -i myfile1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts temp1.ts
ffmpeg -i myfile2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts temp2.ts
// now join
ffmpeg -i "concat:temp1.ts|temp2.ts" -c copy -bsf:a aac_adtstoasc output.mp4

বিঃদ্রঃ! : আউটপুট প্রথম ফাইলের মতো হবে (এবং দ্বিতীয়টি নয়)


2
আমার উত্তরে চিত্রিত হিসাবে, নীচে, ফাইলগুলি ট্রান্সকোডিং করা জরুরি নয়। কোনও মধ্যবর্তী পদক্ষেপ ছাড়াই এবং কোনও পুনরায় এনকোডিং ছাড়াই এফএফপিপেগ একাধিক এমপি 4 ফাইল একক এমপি 4 ফাইলে সংযুক্ত করতে পারে। কেবলমাত্র যে ক্ষেত্রে কোনও পুনরায় এনকোডিংয়ের প্রয়োজন হবে তা যদি মূল ফাইলগুলি এমপি 4 ফাইল না হয় তবে উদ্দেশ্যটি হয় এমপি 4 ফাইল আউটপুট ফাইল হিসাবে তৈরি করা।
এড 999

@T। টুডুয়া: আপনার দুটি এমপি 4 উত্স ফাইলগুলির মধ্যে পার্থক্যগুলি কী কী তা আমি জানতে আগ্রহী। তারা কি বিভিন্ন নমুনার হার (উদাঃ 44,100 হার্জ এবং 48,000 হার্জ) ব্যবহার করছেন? অথবা তারা বিভিন্ন বিট রেট (যেমন 128 কেবিপিএস এবং 64 কেবিপিএস) ব্যবহার করছে? এই জাতীয় ক্ষেত্রে, কমান্ড-সি অনুলিপি (একটি স্ট্রিম-কপির নির্দেশ) উত্স ফাইলগুলিকে সামঞ্জস্যপূর্ণ করার জন্য কীভাবে পরিবর্তন করতে পারে তা আমি পুরোপুরি বুঝতে পারি না।
এড 999

4
@ টি টুডো হাই, ভিডিওগুলি অডিও ট্র্যাক ছাড়াই কমান্ডটি ভাল কাজ করে। যাইহোক, যখন myfile1.mp4 অডিও ছাড়াই এবং myfile2.mp4 অডিও সহ থাকে, ফলাফল আউটপুট.এমপি 4 অডিও ছাড়াই হয়। প্রত্যাশিত আউটপুট.এমপি 4 এ অডিও থাকা উচিত। আমি কিভাবে এটা সমাধান করতে পারে?
উত্তরঘাও

2
@ টি.টোডা এর .... এটি খুব খারাপ। ফাইল 1 | ফাইল 2 ফাইল 2 | ফাইল 1 দিয়ে বিভিন্ন ভিডিও উত্পন্ন করে। আদেশ গুরুত্বপূর্ণ।
যাহাও

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

35

আমি .mp3একটিতে তিনটি অডিও ফাইল যুক্ত করতে চেষ্টা করছিলাম.m4a ফাইলে যুক্ত এবং এই ffmpeg কমান্ডটি কাজ করে।

ইনপুট আদেশ:

ffmpeg -i input1.mp3 -i input2.mp3 -i input3.mp3 -filter_complex concat=n=3:v=0:a=1 -f MOV -vn -y input.m4a

এর অর্থ: "-ফিল্টার_ কমপ্লেক্স কনক্যাট = এন = 3: ভি = 0: এ = 1" :

কনক্যাট মানে মিডিয়া কনটেনেট (যোগদান) ফাংশনটি ব্যবহার করুন।
এন মানে ইনপুট ফাইলের মোট গণনা নিশ্চিত করুন।
ভি মানে ভিডিও আছে ? 0 = কোন ভিডিও ব্যবহার করুন, 1 = ভিডিও রয়েছে।
একটি মানে অডিও আছে ? 0 = অডিও না ব্যবহার করুন, 1 = অডিও ধারণ করুন।
-f উপায়ে জোর সেট ফাইল ফরম্যাট (সমস্ত সমর্থিত বিন্যাসের, ব্যবহার দেখতে ffmpeg -formats)
-vn উপায়ে নিষ্ক্রিয় ভিডিও (এবং -anwould নিষ্ক্রিয় অডিও যদি চেয়েছিলেন নয়)
-y উপায়ে ঊর্ধ্বলিপি আউটপুট ফাইল (আউটপুট ফাইল আগে থেকেই আছে থাকেন)।

আরও তথ্যের জন্য: ffmpeg -h full সমস্ত বিকল্প মুদ্রণ ব্যবহার করুন (সমস্ত ফর্ম্যাট এবং কোডেক নির্দিষ্ট বিকল্পগুলি সহ খুব দীর্ঘ)


1
ফাই -f concat -safe 0 -i "file.txt" -c copy -y "OutPut.mp4"এটি ব্যবহার করে এটি কনক্যাট হবে তবে যখন কিছু ভিডিও অডিও সহ থাকে এবং কিছু অডিও ব্যতীত কাজ করে না তবে কীভাবে আমি এটি বাছাই করতে পারি। ধন্যবাদ -
আহমাদ

1
এইটা কাজ করে. আপনার উত্তরের বিস্তারিত ব্যাখ্যার জন্য ধন্যবাদ। এটা খুব সহায়ক।
জো টি বোকা

31

আমি মধ্যবর্তী ফর্ম্যাট হিসাবে এমপিজি ব্যবহার করে শেষ করেছি এবং এটি কাজ করেছে (দ্রষ্টব্য এটি একটি বিপজ্জনক উদাহরণ, -কিস্কেল 0 ভিডিওটি পুনরায় এনকোড করবে ...)

ffmpeg -i 1.mp4 -qscale 0 1.mpg
ffmpeg -i 2.mp4 -qscale 0 2.mpg
cat 1.mpg 2.mpg | ffmpeg -f mpeg -i - -qscale 0 -vcodec mpeg4 output.mp4

8
এই মন্তব্য হিসাবে, -sameqসরানো হয়েছে। -qscale 0পরিবর্তে ব্যবহার করুন।
জাভিয়ের হো

6
-sameq"একই মানের" এর অর্থ এই নয় এবং @ xavierHo দ্বারা উল্লিখিত হিসাবে ffmpeg থেকে সরানো হয়েছে।
লগইন

3
দু'টি ফাইলকে একত্রীকরণের জন্য একটি মধ্যবর্তী ফর্ম্যাটটির মাধ্যমে ভিডিওটি ট্রান্সকোড করা লজ্জাজনক বলে মনে হচ্ছে। আপনি প্রজন্মের ক্ষতি পাবেন। কন্টেইনার বিন্যাসের চেয়ে আরও গভীর না হওয়া concatএবং ffmpeg কমান্ডটি ব্যবহার করা ভাল , যেমন @rogerdpack উপরে রয়েছে।
র্যান্ডল কুক

8
এটি কীভাবে গৃহীত উত্তর? এটি খুব খারাপ পদ্ধতি।
নাম 9

4
@ সার্জবার্চ কারণ এটি কাজ করে। আমি পৃষ্ঠাটিতে অন্য সমস্ত কিছুর চেষ্টা করেছি - তাদের কোনওটিই কাজ করে না।

14

এফএফএমপিগে কনক্রিটেশন করার বিভিন্ন উপায়ে বিশদ নথিপত্র এখানে পাওয়া যাবে

আপনি 'কনক্যাট ফিল্টার' ব্যবহার করতে পারেন দ্রুত ।

এটি একটি পুনরায় এনকোড সম্পাদন করে। যখন ইনপুটগুলির বিভিন্ন ভিডিও / অডিও ফর্ম্যাট থাকে তখন এই বিকল্পটি সেরা।

2 টি ফাইল সংযুক্ত করার জন্য:

ffmpeg -i input1.mp4 -i input2.webm \
-filter_complex "[0:v:0] [0:a:0] [1:v:0] [1:a:0] concat=n=2:v=1:a=1 [v] [a]" \
-map "[v]" -map "[a]" output.mp4

3 টি ফাইল সংযুক্ত করার জন্য:

ffmpeg -i input1.mp4 -i input2.webm -i input3.mp4 \
-filter_complex "[0:v:0] [0:a:0] [1:v:0] [1:a:0] [2:v:0] [2:a:0] concat=n=3:v=1:a=1 [v] [a]" \
-map "[v]" -map "[a]" output.mp4

এটি একইসাথে একাধিক ইনপুট ফাইল প্রকারের জন্যও কাজ করে।


আপনি এই উদাহরণে থাকা বিকল্পগুলির বিষয়ে আরও বিশদ নির্দিষ্ট করতে পারেন?
বিকাশকারী

@ ডেভেলপার: বিকল্পগুলির ব্যাখ্যাের জন্য -> কনক্যাট ফিল্টার উইকি
এসজে ২০০

4
3 টি ফাইলকে সংযুক্ত করার সময় আপনার উচিত কনক্যাট = এন = 3: ভি = 1: এ = 1 নন = 2
সিনাপ্যাপিস


সাইনাপসিসকে এটি নির্দেশ করার জন্য এবং কমান্ডটি আপডেট করার জন্য
জর্জিসিসি

10

আমি পেয়েছি পাইপ অপারেটর গ্রহণযোগ্য উত্তরে একটি ম্যাকের উপর কয়েকটি এমপি 4 সন্ধানের জন্য বিকল্প 3 ব্যবহার করার সময় আমার পক্ষে কাজ করেনি।

নীচের ওয়ান-লাইনার কোনও ম্যাক (হাই সিয়েরা) তে এমপি 4 গুলি যুক্ত করতে কাজ করে, কোনও মধ্যস্থতাকারী ফাইল তৈরির প্রয়োজন নেই।

ffmpeg -f concat -safe 0 -i <(for f in ./*.mp4; do echo "file '$PWD/$f'"; done) -c copy output.mp4


2
এই সহজ উত্তরটি কেবলমাত্র আমার পক্ষে কাজ করেছিল। ডকুমেন্টেশনের পৃষ্ঠাগুলিতে এখানে এবং অন্যত্র পৃষ্ঠাগুলি, যখন এই সাধারণ ওয়ান-লাইনারের প্রয়োজনীয় সমস্ত কিছুই - এবং প্রকৃতপক্ষে কাজ করে। ধন্যবাদ.
blujay

10

এখানে 2 টি খাঁটি বাশ সমাধান কেবলমাত্র ব্যবহার করছে ffmpegএবং ব্যবহার হচ্ছে না

  • একটি মধ্যস্থতাকারী ফাইল
  • পার্ল, পাইথন বা জাভাস্ক্রিপ্ট

ওয়ান-লাইনারের সমাধান ব্যবহার করে ls

ls video1.mp4 video2.mp4 | while read line; do echo file \'$line\'; done | ffmpeg -protocol_whitelist file,pipe -f concat -i - -c copy output.mp4

ফাংশন যা 0 বা 2+ আর্গুমেন্ট নেয়

#######################################
# Merge mp4 files into one output mp4 file
# usage:
#   mergemp4 #merges all mp4 in current directory
#   mergemp4 video1.mp4 video2.mp4
#   mergemp4 video1.mp4 video2.mp4 [ video3.mp4 ...] output.mp4 
#######################################
function mergemp4() {
  if [ $# = 1 ]; then return; fi

  outputfile="output.mp4"

  #if no arguments we take all mp4 in current directory as array
  if [ $# = 0 ]; then inputfiles=($(ls -1v *.mp4)); fi
  if [ $# = 2 ]; then inputfiles=($1 $2); fi  
  if [ $# -ge 3 ]; then
    outputfile=${@: -1} # Get the last argument
    inputfiles=(${@:1:$# - 1}) # Get all arguments besides last one as array
  fi

  # -y: automatically overwrite output file if exists
  # -loglevel quiet: disable ffmpeg logs
  ffmpeg -y \
  -loglevel quiet \
  -f concat \
  -safe 0 \
  -i <(for f in $inputfiles; do echo "file '$PWD/$f'"; done) \
  -c copy $outputfile

  if test -f "$outputfile"; then echo "$outputfile created"; fi
}

দ্রষ্টব্য: এই থ্রেডে কিছু সমাধান চেষ্টা করেছিলেন এবং কেউই আমাকে সন্তুষ্ট করেনি


9

রজারডপ্যাক এবং এড 999 এর প্রতিক্রিয়াগুলির উপর ভিত্তি করে, আমি আমার .sh সংস্করণ তৈরি করেছি

#!/bin/bash

[ -e list.txt ] && rm list.txt
for f in *.mp4
do
   echo "file $f" >> list.txt
done

ffmpeg -f concat -i list.txt -c copy joined-out.mp4 && rm list.txt

এটা সব যোগ দেয় *.mp4 বর্তমান ফোল্ডারে থাকা ফাইলগুলিতে করেjoined-out.mp4

ম্যাক পরীক্ষিত।

ফলস্বরূপ ফাইলাইজ করা আমার 60 পরীক্ষিত ফাইলের সমষ্টি sum কোনও ক্ষতি হওয়া উচিত নয়। ঠিক যেটা আমার দরকার ছিল


9

এটি আমার জন্য কাজ করেছে (উইন্ডোজগুলিতে)

ffmpeg -i "concat:input1|input2" -codec copy output

একটি উদাহরণ...

ffmpeg -i "concat:01.mp4|02.mp4" -codec copy output.mp4

পাইথন

একটি ফোল্ডারে যতগুলি এমপি 4 রয়েছে তার সাথে এটি করার জন্য কিছু পাইথন কোড ব্যবহার করে (পাইথন.অর্গ থেকে পাইথন ইনস্টল করুন, অনুলিপি করুন এবং পেস্ট করুন এবং এমপিপি.পি নামে একটি ফাইলে এই কোডটি সংরক্ষণ করুন এবং পাইথন দিয়ে ফোল্ডারে খোলা সেন্টিমিডি থেকে চালনা করুন) এমপিপি.পি এবং ফোল্ডারে থাকা সমস্ত এমপিথিকে সংযুক্ত করা হবে)

import glob
import os

stringa = ""
for f in glob.glob("*.mp4"):
    stringa += f + "|"
os.system("ffmpeg -i \"concat:" + stringa + "\" -codec copy output.mp4")

পাইথন সহ 2 সংস্করণ

আমার ব্লগে আমার পোস্ট থেকে নেওয়া , আমি অজগরটিতে এটিই করি:

import os
import glob

def concatenate():
    stringa = "ffmpeg -i \"concat:"
    elenco_video = glob.glob("*.mp4")
    elenco_file_temp = []
    for f in elenco_video:
        file = "temp" + str(elenco_video.index(f) + 1) + ".ts"
        os.system("ffmpeg -i " + f + " -c copy -bsf:v h264_mp4toannexb -f mpegts " + file)
        elenco_file_temp.append(file)
    print(elenco_file_temp)
    for f in elenco_file_temp:
        stringa += f
        if elenco_file_temp.index(f) != len(elenco_file_temp)-1:
            stringa += "|"
        else:
            stringa += "\" -c copy  -bsf:a aac_adtstoasc output.mp4"
    print(stringa)
    os.system(stringa)

concatenate()

1
কনক্যাট প্রোটোকলটি এমপি 4 এর সাথে ব্যবহার করা উচিত নয় এবং গৃহীত উত্তরে উল্লিখিত হিসাবে কাজ করবে না ।
লগইন

@ লর্ডনেকবার্ড আমি অবাক হয়েছি আউটপুট বিটরেট নির্দিষ্ট করার সময় আপনি 2 এমপি 4 ভিডিও সংযুক্ত করার বিষয়ে এই ffmpeg প্রশ্নের উত্তর জানেন কিনা? video.stackexchange.com/q/24569/5657 ধন্যবাদ।
রায়ান

@ লর্ডনেকবার্ড আমার অনুমান যে আপনার উত্তরটি সত্ত্বেও যদি সেরা হয় তবে আপনার উত্তরটি সবচেয়ে ভাল হবে! আমি আমার নিজের থেকে বিশেষ সন্তুষ্ট নই।
রায়ান

শুধুমাত্র (লর্ড নেকবার্ড পয়েন্ট হিসাবে দেখিয়েছেন) নয় যে একটি এমপি 4 ফাইলটিকে মধ্যবর্তী .TS ফর্ম্যাটে রূপান্তর করা প্রয়োজন কনকানটেশন সফল হওয়ার জন্য, তবে, আরও খারাপটি, এই উত্তরটি ইনপুটটির প্রয়োজনীয়তাও সম্বোধন করতে শুরু করে না ভিডিও ফাইলগুলিতে বিটরেট, ফ্রেম হার, নমুনা হার, টাইমবেস এবং সময়কাল মিলবে। এই 5 টি কারণের মধ্যে সাধারণ 5 টি ছাড়া, ফাইলগুলি সংমিশ্রণ করা যায় না (যেমন স্ট্রিম অনুলিপি ব্যবহার করে যোগ দেওয়া হয়েছে ), তবে পরিবর্তে পুনরায় এনকোড করা আবশ্যক।
এড 999

7

জন্য .mp4ফাইল, আমি দেখেছি এটা ভাল এবং দ্রুত ওপেনসোর্স কমান্ড লাইন টুল ব্যবহার করার জন্য কাজ করে: mp4box। তারপরে আপনি এটিকে এভাবে ব্যবহার করতে পারেন:

mp4box.exe -add video1.mp4 -cat video2.mp4 destvideo.mp4

এটি বেশিরভাগ প্ল্যাটফর্মের জন্য এখানে ডাউনলোড করুন: https://gpac.wp.imt.fr/mp4box/


2
যদিও এটি কারওর পক্ষে কার্যকর হতে পারে তবে প্রয়োজনীয়তাটি ছিল: " আমি এফএফএমপিইগ ব্যবহার করে দুটি এমপি 4 ফাইল সংযুক্ত করার চেষ্টা করছি an এটি একটি স্বয়ংক্রিয় প্রক্রিয়া হওয়ার জন্য আমার এটি প্রয়োজন "। দয়া করে পুরো প্রশ্নটি পড়ুন এবং চেষ্টা করুন এবং বিন্দুতে একটি উত্তর সরবরাহ করুন।
thvs86

5
এই উত্তরটি সম্পূর্ণ পয়েন্টে। এটি একটি FOSS সরঞ্জাম যা একই কাজ করে। এটি ঠিক FFmpeg এর মতো স্ক্রিপ্টে ব্যবহার করা যেতে পারে। এটি এফএফপিপিগের উত্তরগুলির চেয়ে আরও সহজভাবে কাজটি পায়। তারা কত জটিল তা দেখুন! তাদের মধ্যে একটি এফএফএমপিগ কল করতে নোড.জেএস ব্যবহার করে! বাতুলতা। দয়া করে উইনকিজম দিয়ে থামুন এবং স্ট্যাক ওভারফ্লোটিকে আবার দরকারী করে দেখুন। এই সাইটটি আপনার মত মাতালদের জন্য প্রাক্তন স্ব-ধন্যবাদগুলির একটি ছায়া। এছাড়াও, এই প্রশ্নটি "এক্সওয়াই সমস্যা" এর একটি উদাহরণ, যার সাথে আপনার মতো একজন ভ্রূণু পরিচিত হওয়া উচিত।
blujay

Mp4box একটি FOSS সরঞ্জাম এটি বিবেচনা করে না। প্রশ্নটি এমপিথাক্স নয়, ffmpeg ব্যবহার করে উত্তর চেয়েছিল।
jramos775

@ thvs86 আমি এর একটি উদাহরণ। আমি ffmpeg এটি মিডিয়া জন্য একটি বাস্তব সুইস ছুরি হিসাবে ব্যবহার। আমি আমার নির্দিষ্ট ব্যবহারের ক্ষেত্রেও সাহায্যের জন্য অনুসন্ধান করি, কারণ তর্কগুলির স্ট্রোকচার বেশ জটিল হতে পারে (যা এখানে বিবিধ উত্তর দ্বারা প্রদর্শিত হয়)। এই প্রথম আমি এমপুবক্সবক্স সম্পর্কে শুনেছি এবং এটি যদি এই উত্তরটির জন্য না হয় তবে আমি এটি খুঁজে পেতাম না। সুতরাং আমার কাছ থেকে +1 এবং দয়া করে, দয়া করে অর্থহীন ইন্টারনেট পয়েন্ট এবং অনমনীয় নিয়মগুলির চেয়ে উত্তর খোঁজার লোকদের সম্পর্কে আরও ভাবুন।
পাভেল

4

আমি বেশ কয়েকটি GoPro এমপি 4 এর 720p এমপি 4 এর সাথে একত্রীকরণের জন্য তৈরি একটি স্ক্রিপ্ট এখানে রইলাম। আশা করি এটি সাহায্য করবে।

#!/bin/sh
cmd="( "
for i; do
    cmd="${cmd}ffmpeg -i $i -ab 256000 -vb 10000000 -mbd rd -trellis 2 -cmp 2 -subcmp 2 -g 100 -f mpeg -; "
done
cmd="${cmd} ) | ffmpeg -i - -vb 10000000 -ab 256000 -s 1280x720 -y out-`date +%F-%H%M.%S`.mp4"
echo "${cmd}"
eval ${cmd}

এটি মনযোগ দেয় না। এই কোডটি ইনপুটগুলিকে সামঞ্জস্য করে না, এটি তাদের পুনরায় এনকোড করে। এটি যেকোন স্বেচ্ছাসেবী ভিডিও ফাইল নেয় এবং এগুলিকে একটি সাধারণ অডিও এবং ভিডিও বিটরেটে পরিবর্তন করে (উত্স ফাইলগুলির মূল বিটরেট বা মূল ফ্রেমসাইজ নির্বিশেষে)। ও / পি স্ট্রিম অনুলিপি ব্যবহার করে দুটি ফাইলে যোগ দিতে চেয়েছিল, সেগুলিকে পুনরায় এনকোড করে না, তাই এটি জিজ্ঞাসিত প্রশ্নের সমাধান করে না।
এড 999

4

ডকুমেন্টেশন থেকে এখানে: https://trac.ffmpeg.org/wiki/Concateate

আপনার যদি এমপি 4 ফাইল থাকে তবে এগুলি প্রথমে এমপিইজি -2 পরিবহন স্ট্রিমগুলিতে ট্রান্সকোড করে নিখরচায় সংহত হতে পারে । এইচ .264 ভিডিও এবং এএসি অডিও সহ, নিম্নলিখিতগুলি ব্যবহার করা যেতে পারে:

ffmpeg -i input1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate1.ts
ffmpeg -i input2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate2.ts
ffmpeg -i "concat:intermediate1.ts|intermediate2.ts" -c copy -bsf:a aac_adtstoasc output.mp4

এই পদ্ধতির সমস্ত প্ল্যাটফর্মে কাজ করে।

আমার এটি ক্রস প্ল্যাটফর্মের স্ক্রিপ্টে সজ্জিত করার দক্ষতার প্রয়োজন ছিল, তাই আমি fluent-ffmpegনিম্নলিখিত সমাধানটি ব্যবহার করেছি এবং সামনে এলাম:

const unlink = path =>
  new Promise((resolve, reject) =>
    fs.unlink(path, err => (err ? reject(err) : resolve()))
  )

const createIntermediate = file =>
  new Promise((resolve, reject) => {
    const out = `${Math.random()
      .toString(13)
      .slice(2)}.ts`

    ffmpeg(file)
      .outputOptions('-c', 'copy', '-bsf:v', 'h264_mp4toannexb', '-f', 'mpegts')
      .output(out)
      .on('end', () => resolve(out))
      .on('error', reject)
      .run()
  })

const concat = async (files, output) => {
  const names = await Promise.all(files.map(createIntermediate))
  const namesString = names.join('|')

  await new Promise((resolve, reject) =>
    ffmpeg(`concat:${namesString}`)
      .outputOptions('-c', 'copy', '-bsf:a', 'aac_adtstoasc')
      .output(output)
      .on('end', resolve)
      .on('error', reject)
      .run()
  )

  names.map(unlink)
}

concat(['file1.mp4', 'file2.mp4', 'file3.mp4'], 'output.mp4').then(() =>
  console.log('done!')
)

1
ffmpeg \
  -i input_1.mp4 \
  -i input_2.mp4 \
  -filter_complex '[0:v]pad=iw*2:ih[int];[int][1:v]overlay=W/2:0[vid]' \
  -map [vid] \
  -c:v libx264 \
  -crf 23 \
  -preset veryfast \
  output.mp4

1
কেবল একটি উত্তর পোস্ট করে নয়, আপনি সামান্য ব্যাখ্যা যোগ করতে পারেন যা সমাধানটি ওপি এবং ভবিষ্যতের পাঠকদেরও আরও ভাল বোঝে।
বালাগুরুনাথন মেরিমুথু

1
এটি উভয় ইনপুট একে অপরের পাশে একই সময় হিসাবে খেলতে একটি নতুন নীরব ভিডিও তৈরি করেছে। আমি প্রত্যাশা করেছিলাম কনটেনটেশন এমন একটি ভিডিও তৈরি করবে যেখানে ইনপুট_1. এমপি 4 প্লে হবে এবং তারপরে ইনপুট_2.এমপি 4
অ্যালেক্সেক্স রোচে

3
এটি পুরোপুরি ভুল উত্তর ছিল। এটি ভিডিওগুলিতে একত্রিত হয় নি, এটি কেবল চুপচাপ পাশাপাশি তাদের পাশাপাশি বাজায়, যেমন @ অ্যালেক্সেক্সরচে উল্লেখ করেছেন।
কালব তোউলিয়ান

1

বর্তমান ডিরেক্টরি থেকে সমস্ত এমপি 4 ফাইল একত্রিত করা হচ্ছে

আমি ব্যক্তিগতভাবেই বাহ্যিক ফাইল না তৈরি করতে চাই যা পরে মুছতে হয়, তাই আমার সমাধান অনুসরণ করছিল যার মধ্যে ফাইল সংখ্যায়ন তালিকা অন্তর্ভুক্ত থাকে (যেমন file_1_name, file_2_name, file_10_name, file_20_name, file_100_name, ...)

#!/bin/bash
filesList=""
for file in $(ls -1v *.mp4);do #lists even numbered file
    filesList="${filesList}${file}|"
done
filesList=${filesList%?} # removes trailing pipe
ffmpeg -i "concat:$filesList" -c copy $(date +%Y%m%d_%H%M%S)_merged.mp4

আমি এই কোডটি নোটপ্যাডে অনুলিপি করেছি এবং কিছুই ঘটেনি।
7vujy0f0hy

1
@ 7vujy0f0 এই বাশ শেলের সাহায্যে একটি লিনাক্সে কাজ করে সম্ভবত এটি সাইগউইনের সাথে কাজ করতে পারে
পিপো

1

স্ক্রিপ্ট নীচে বিভিন্ন চেষ্টা করার পরে উইন্ডোজ 10 পাওয়ারশেলে আমার জন্য কাজ করেছে।

    $files=Get-ChildItem -path e:\ -Filter *.mp4


    $files| ForEach-Object  {"file '$($_.FullName)'"}| Out-File -FilePath e:\temp.txt -Encoding ASCII


    if (-not (test-path "e:\ffmpeg\bin\ffmpeg.exe")) {throw "e:\ffmpeg\bin\ffmpeg.exe needed"}

    E:\ffmpeg\bin\ffmpeg.exe -safe 0 -f concat -i "e:\temp.txt" -c copy -bsf:v hevc_mp4toannexb -an e:\joined.mp4

    # Conversion Cleanup
    Remove-Item e:\temp.txt

এখানে প্রথমে দুটি লাইন একটি টেক্সট ফাইল তৈরি করে temp.txt যা নিম্নলিখিত বিষয়বস্তু রয়েছে has

file 'e:\first.mp4'
file 'e:\second.mp4'

তৃতীয়, চতুর্থ লাইনগুলি ffmpeg পথে উপস্থিত রয়েছে কিনা তা পরীক্ষা করে "join.mp4" তৈরি করুন

অন্যান্য উত্তরগুলির মূল পার্থক্য নীচের মত

usage  of -bsf:v hevc_mp4toannexb -an

আমার এমপি 4 ফাইলের উপরে কাজ করার জন্য, আপনার ভিডিও এনকোডিংয়ের উপর নির্ভর করে নীচের মতো অন্যান্য বিকল্পগুলি ব্যবহার করতে হতে পারে।

h264_mp4toannexb

এ জাতীয় সমস্ত বিটস্ট্রিম ফিল্টার https://ffmpeg.org/ffmpeg-bitstream-filters.html এ পাওয়া যাবে


আমার সিসিটিভি ক্যামেরা থেকে এমপি 4 আসছিল। এই কমান্ড ব্যতীত কথোপকথন আউটপুট ফাইল তৈরি করতে ব্যর্থ। আমি তার ওয়েবসাইট থেকে সর্বশেষ ffmpeg ব্যবহার করছি।
রাহুল মাইন্ডারগী

0

কমান্ড সাবস্টিটিউশন এবং কনক্যাট ভিডিও ফিল্টার ব্যবহার করে এমপি 4 ফাইলের পূর্ণ ডিরেক্টরিতে যোগদানের জন্য আমার পদ্ধতিটি এখানে দেখানো হয়েছে - অন্য কেউ এই ওয়ান-লাইনারের বাইরে কিছুটা ব্যবহার পাবে, বিশেষত আপনার অনেকগুলি ফাইল থাকলে (আমি কেবল একটিতে 17 টি ফাইল যোগ হয়ে গেছে):

ffmpeg $(for f in *.mp4 ; do echo -n "-i $f "; done) -filter_complex \
"$(i=0 ; for f in *.mp4 ; do echo -n "[$i:v] [$i:a] " ; i=$((i+1)) ; done \
&& echo "concat=n=$i:v=1:a=1 [v] [a]")" -map "[v]" -map "[a]" output.mp4

এনবি এই কমান্ডটি আপনার ফাইলগুলিকে যার ক্রমে নাম দেওয়া হয়েছে (যেমন আপনি চালনা করলে তারা যেমন উপস্থাপিত হয় একইভাবে ls *.mp4) - তাতে আমার ক্ষেত্রে তাদের প্রত্যেকটির একটি ট্র্যাক নম্বর ছিল, সুতরাং এটি দুর্দান্ত কাজ করেছিল।


0

এখানে বর্ণিত কনক্যাট প্রোটোকল; https://trac.ffmpeg.org/wiki/Concatenate#protocol

মধ্যবর্তী ফাইলগুলি এড়ানোর জন্য নামযুক্ত পাইপ ব্যবহার করে প্রয়োগ করা হয়

খুব দ্রুত (পড়ুন: তাত্ক্ষণিক), কোনও ফ্রেম বাদ পড়ে নি, এবং ভালভাবে কাজ করে।

নামক পাইপ ফাইলগুলি মুছতে এবং মনে রাখবেন ভিডিওটি H264 এবং AAC কিনা যা আপনি ঠিক করতে পারেন ffmpeg -i filename.mp4(এইচ 264 এবং এ্যাক উল্লেখের জন্য চেক করুন)


-1

পুনরায় ব্যবহারযোগ্য পাওয়ারশেল স্ক্রিপ্ট আকারে স্বীকৃত উত্তর

Param(
[string]$WildcardFilePath,
[string]$OutFilePath
)
try
{
    $tempFile = [System.IO.Path]::GetTempFileName()
    Get-ChildItem -path $wildcardFilePath | foreach  { "file '$_'" } | Out-File -FilePath $tempFile -Encoding ascii
    ffmpeg.exe -safe 0 -f concat -i $tempFile -c copy $outFilePath
}
finally
{
    Remove-Item $tempFile
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.