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




h.264 mp4 (11)

এমপি 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

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

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

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

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


বর্তমান ডিরেক্টরি থেকে সব MP4 ফাইল মার্জ

আমি ব্যাক্তিগত ফাইল তৈরি করতে চাই না যেটি পরে আমি মুছে ফেলতে চাই, তাই আমার সমাধানটি অনুসরণ করে ফাইল নাম্বারিং তালিকা অন্তর্ভুক্ত করা হয়েছে (যেমন 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

Ffmpeg মধ্যে concatenation বিভিন্ন উপায়ে বিস্তারিত ডকুমেন্টেশন এখানে পাওয়া যাবে

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

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

Concatenating 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

Concatenating 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

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


rogerdpack এর উপর ভিত্তি করে এবং এড 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

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

ফলে fileize আমার 60 পরীক্ষিত ফাইলের সঠিক যোগফল। কোন ক্ষতি হতে হবে না। ঠিক যেটা আমার দরকার ছিল


আমি এমপিপি ব্যবহার করে মধ্যবর্তী বিন্যাস হিসাবে শেষ করেছি এবং এটি কাজ করেছে (মনে রাখবেন এটি একটি বিপজ্জনক উদাহরণ, -স্কস্কালে 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

আমি পাইপ অপারেটরটি ম্যাকের বিভিন্ন ম্যাপ 4 গ্রহণ করার জন্য বিকল্পটি ব্যবহার করার সময় আমার জন্য কাজ করে নি।

নিম্নলিখিত এক-মাছ ধরার যন্ত্র কোনও মধ্যস্থতাকারী ফাইল তৈরির প্রয়োজন ছাড়াই mp4s সংহত করার জন্য একটি ম্যাক (হাই সিয়েরা) তে কাজ করে।

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


এখানে একটি স্ক্রিপ্ট যা আমি কয়েকটি GoPro MP4 এর 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}

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

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

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

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

আমি একটি ক্রস প্ল্যাটফর্ম স্ক্রিপ্ট এ encapsulate করার প্রয়োজন ছিল, তাই আমি 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!')
)

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

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

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


এই আমার জন্য কাজ (উইন্ডোজ উপর)

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

নির্দিষ্টভাবে

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

পাইথন

অনেক পিপিথন কোড ব্যবহার করে এটি অনেক এমপি 4 দিয়ে একটি ফোল্ডার আমদানি গ্লোব আমদানি আমদানি করে

stringa = ""
for f in glob.glob("*.mp4"):
    stringa += f + "|"

os.system("ffmpeg -i \"concat:" + stringa + "\" -codec copy output.mp4")

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