ক্রপ এবং আকার পরিবর্তন করে একটি ভিডিওকে একটি নির্দিষ্ট পর্দার আকারে রূপান্তর করুন


22

আমি নিজেই এটিকে বের করার চেষ্টা করেছি, তবে অসংখ্য বিকল্পের বিষয়টি আমাকে অবাক করে দেয়।

যে কোনও ইনকামিং ভিডিওকে একটি নির্দিষ্ট পর্দার আকারে রূপান্তর করতে আমি হয় আদর্শভাবে ffmpegবা mencoder(বা অন্য কিছু, কিন্তু আমি জানি যে আমি কাজ করছি) ব্যবহার করতে চাই।

যদি ভিডিওটি আরও প্রশস্ত হয় বা এর জন্য খুব ছোট হয়, তবে ভিডিওটি কেন্দ্র করুন। যদি এটি তখন সঠিক আকার না হয় তবে এটির নির্দিষ্ট আকারের পর্দার আকারটি তৈরি করতে পুনরায় আকার দিন।

এমপি 3 অডিও ট্র্যাক সহ একটি এক্সভিড এভিআইতে আমার সঠিক চূড়ান্ত জিনিসটি 720x480।

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

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


স্পষ্টতই ভিডিও ডিভাইসটি এমপিজি 4 এর সাথে এক্সভিড এভিআইয়ের সাথে কাজ করে, যদি এটি সহজ / আরও ভাল হয়।
অ্যান্ডি জেফরিস

উত্তর:


19

আমি কোনও ffmpeg গুরু নই, তবে এই কৌশলটি করা উচিত।

প্রথমত, আপনি এই জাতীয় ইনপুট ভিডিওর আকার পেতে পারেন:

ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width in.mp4

যুক্তিসঙ্গত সাম্প্রতিক ffmpeg দিয়ে আপনি এই ভিডিওগুলি দিয়ে আপনার ভিডিওর আকার পরিবর্তন করতে পারেন:

ffmpeg -i in.mp4 -vf scale=720:480 out.mp4

দিক অনুপাত রেখে ভিডিওটির আকার পরিবর্তন করতে -1আপনি প্রস্থ বা উচ্চতা সেট করতে পারেন ffmpeg। আসলে, -2একটি ভাল পছন্দ যেহেতু গণনা করা মানটি হওয়া উচিত should সুতরাং আপনি টাইপ করতে পারেন:

ffmpeg -i in.mp4 -vf scale=720:-2 out.mp4

আপনি একবার ভিডিওটি পাওয়ার পরে এটি প্রত্যাশার চেয়ে বড় হতে পারে 720x480যেহেতু আপনি ffmpegউচ্চতা গণনা করতে দিয়েছেন, সুতরাং আপনাকে এটি ক্রপ করতে হবে। এটি এইভাবে করা যেতে পারে:

ffmpeg -i in.mp4 -filter:v "crop=in_w:480" out.mp4

অবশেষে, আপনি এটির মতো একটি স্ক্রিপ্ট লিখতে পারেন (সহজেই অনুকূলিত করা যায়, তবে আমি এটিকে সহজতার জন্য সহজ করে দিয়েছি):

#!/bin/bash

FILE="/tmp/test.mp4"
TMP="/tmp/tmp.mp4"
OUT="/tmp/out.mp4"

OUT_WIDTH=720
OUT_HEIGHT=480

# Get the size of input video:
eval $(ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width ${FILE})
IN_WIDTH=${streams_stream_0_width}
IN_HEIGHT=${streams_stream_0_height}

# Get the difference between actual and desired size
W_DIFF=$[ ${OUT_WIDTH} - ${IN_WIDTH} ]
H_DIFF=$[ ${OUT_HEIGHT} - ${IN_HEIGHT} ]

# Let's take the shorter side, so the video will be at least as big
# as the desired size:
CROP_SIDE="n"
if [ ${W_DIFF} -lt ${H_DIFF} ] ; then
  SCALE="-2:${OUT_HEIGHT}"
  CROP_SIDE="w"
else
  SCALE="${OUT_WIDTH}:-2"
  CROP_SIDE="h"
fi

# Then perform a first resizing
ffmpeg -i ${FILE} -vf scale=${SCALE} ${TMP}

# Now get the temporary video size
eval $(ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width ${TMP})
IN_WIDTH=${streams_stream_0_width}
IN_HEIGHT=${streams_stream_0_height}

# Calculate how much we should crop
if [ "z${CROP_SIDE}" = "zh" ] ; then
  DIFF=$[ ${IN_HEIGHT} - ${OUT_HEIGHT} ]
  CROP="in_w:in_h-${DIFF}"
elif [ "z${CROP_SIDE}" = "zw" ] ; then
  DIFF=$[ ${IN_WIDTH} - ${OUT_WIDTH} ]
  CROP="in_w-${DIFF}:in_h"
fi

# Then crop...
ffmpeg -i ${TMP} -filter:v "crop=${CROP}" ${OUT}

আমি এই মজার অনুভূতিটি অনুভব করেছি যে এটি একটি দৃশ্য মিস করবে, তবে আমি ভিডিও ফাইলের প্রচুর পরিমাণে চেষ্টা করে দেখেছি এটি সঠিকভাবে কাটতে এবং ভিডিওটিকে পরম সঠিক আকারে আকার দিতে পারে - ভাল হয়েছে!
অ্যান্ডি জেফরিস

দেখে মনে হচ্ছে CROP_SIDE সিদ্ধান্তের সাথে কিছু ভুল আছে।
সুতরা

Actual # আসল এবং কাঙ্ক্ষিত আকারের মধ্যে রেট পান w_rate = echo "scale=3; ${in_width}/${out_width}*1000"| bc | awk '{printf "%d", $0}' h_rate = echo "scale=3; ${in_height}/${out_height}*1000"| bc | awk '{printf "%d", $0}' # আসুন ছোট দিকটি নেওয়া যাক, তাই ভিডিওটি কমপক্ষে পছন্দসই আকারের চেয়ে বড় হবে এবং লম্বা দিকটি ক্রপ করবে: ক্রপ_সাইড = 'এন' যদি [$ {w_rate} -gt $ _ h_rate}]; তারপরে স্কেল = "- 2: _ _ আউট_হাইট}" ক্রপ_সাইড = 'ডাব্লু' অন্য স্কেল = "$ {আউট_ প্রস্থ}: - 2" ক্রপ_সাইড = 'এইচ' ফাই `
সূত্র

23
ffmpeg -i input.file -vf "scale=(iw*sar)*max(720/(iw*sar)\,480/ih):ih*max(720/(iw*sar)\,480/ih), crop=720:480" -c:v mpeg4 -vtag XVID -q:v 4 -c:a libmp3lame -q:a 4 output.avi

আপনার ইনপুট ফাইলটির নামের সাথে "ইনপুট.ফাইল" প্রতিস্থাপন করুন।


এটি শীর্ষস্থানীয় উত্তর হওয়া উচিত কারণ এর জন্য এফএফপ্রোবে কল করার প্রয়োজন নেই। কমান্ডের ব্যাকস্ল্যাশ কমা ক্রমগুলি নোট করুন। আপনি যদি সি / জাভাস্ক্রিপ্ট / পিএইচপি স্ট্রিংয়ে কমান্ডটি রেখে থাকেন তবে আপনাকে ব্যাকস্ল্যাশগুলি থেকে বাঁচতে হবে।
11'30 এ ক্লোং

ভাল, ব্রায়ান। ভিডিও ফিল্টার অংশটিও আমার প্রয়োজন মতো ছিল। (অর্থাত্ পুরানো 4: 3 ভিডিওগুলিকে 16: 9 এ রূপান্তর করতে)!
ডেভ

1
প্রতিভা! সব এক মধ্যে সম্পন্ন।
সোলি

2
উপরের স্ক্রিপ্টটি অনেক ক্লিনার। দ্রষ্টব্য আপনি যদি XVID / এমপি 3 না চান আপনি কেবল দ্বিতীয় উদ্ধৃতি চিহ্নের পরে ট্যাগগুলি এমন কিছুতে পরিবর্তন করতে পারেন-c:a copy scaled_result.mp4
নিক

7

আপনি যদি একসাথে ক্রপ করতে এবং স্কেল করতে চান তবে আপনি এর মতো ফসল-পরে-স্কেল ফিল্টারচেইন তৈরি করতে পারেন:

ffmpeg -i SomeInput.mp4 -vf "crop=in_h*9/16:in_h,scale=-2:400" -t 4 SomeOutput.mp4

উপরের প্রথমটি 16: 9 প্রতিকৃতিতে একটি ভিডিও ফসল দেয়, তারপরে 400px উচ্চ x উপযুক্ত (এমনকি সংখ্যার) প্রস্থে স্কেল করে।


1

আমি ffmpeg এ নতুন তবে এখন VB.NET- এ চলছে এমন একটি ছোট্ট সামান্য রূপান্তরকারী যা ছোট ডিভাইসে ব্যবহারের জন্য বিভিন্ন আউটপুট ফর্ম্যাটগুলির কাঁচা সিনেমা তৈরি করে যার মধ্যে এসডি কার্ড অ্যাক্সেস রয়েছে তবে জটিল ভিডিও ডিকোড করার পর্যাপ্ত শক্তি নেই।

আকার পরিবর্তন ও ক্রপ করার সময় এটি যেভাবে কাজ করে সে কারণে আমাকে এটিকে ম্যানুয়ালি কোড করতে হয়েছিল এবং পরামিতিগুলি তৈরি করতে হয়েছিল। মূলত আমার ফলাফল প্রস্থ এবং উচ্চতা জানতে হবে।

বিকল্পগুলির জন্য আমার কাছে দুটি চেক বাক্স রয়েছে: -

পক্ষের অনুপাত (এক্স) সংরক্ষণ করুন সমস্ত পিক্সেল (এক্স) পূরণ করুন

ইনপুট হিসাবে কেবল 4 টি ভেরিয়েবলের প্রয়োজন (1) মূল ভিডিওর প্রস্থ, (2) আসল ভিডিও উচ্চতা, (3) ডিভাইসের প্রস্থ, (4) ডিভাইসের উচ্চতা।

যদিও ভিবি.এনইটি-র জন্য কোনও ভাষার পক্ষে বেশ সহজেই মানিয়ে নেওয়া যায়।

    Dim crop As String = "" ' will build this in ffmpeg format for -s or scale and crop

    If cbAspectRatio.Checked = False Then
        m_dest_output_w = sz._w
        m_dest_output_h = sz._h

        ' scale to w * h - simple
        crop = " -s " & m_dest_output_w & ":" & m_dest_output_h
    Else
        Dim ratio As Double = CDbl(m_video_width) / CDbl(m_video_height) ' this is aspect ratio of original unsized video

        If cbFillPixels.Checked = False Then ' shrink to fit
            If sz._w * ratio <= m_video_height Then
                m_dest_output_w = sz._w
                m_dest_output_h = sz._w / ratio
            Else
                m_dest_output_h = sz._h
                m_dest_output_w = sz._h / ratio
            End If

            ' no cropping just resizing to a non-filled area that fits

            crop = " -s " & m_dest_output_w & ":" & m_dest_output_h ' no cropping needed as letterboxed

        Else ' expand / fill --- cropping needed
            If sz._w * ratio >= m_video_height Then
                m_dest_output_w = sz._w
                m_dest_output_h = sz._w * ratio

                crop = ",crop=" & sz._w & ":" & sz._h & ":0:" & Math.Abs((m_dest_output_h - sz._h)) \ 2
            Else
                m_dest_output_h = sz._h
                m_dest_output_w = sz._h * ratio

                crop = ",crop=" & sz._w & ":" & sz._h & ":" & Math.Abs((m_dest_output_w - sz._w)) \ 2 & ":0"
            End If

            crop = " -vf scale=" & m_dest_output_w & ":" & m_dest_output_h & crop

            m_dest_output_w = sz._w
            m_dest_output_h = sz._h
        End If
    End If
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.