سؤال باستخدام ffmpeg لقطع الفيديو


أنا أستخدم ffmpeg لقطع جزء من ملف كبير مثل هذا:

ffmpeg -i input.wmv -ss 60 -t 60 -acodec copy -vcodec copy output.wmv

ال -ss جزء يعمل بشكل جيد ولكن -t يتم تجاهلها. بشكل صحيح يزيل الثواني المحددة الأولية المحددة مع -ss ولكن بعد ذلك يستمر في الوصول إلى نهاية الإدخال مع النسخة.

هل هناك طريقة لاستخدام ffmpeg لقطع نهاية الفيديو دون إعادة ترميزه؟


265
2018-05-06 14:12


الأصل


هذا النحو صحيح. - jiggunjer
stackoverflow.com/questions/18444194/... - Ciro Santilli 新疆改造中心 六四事件 法轮功


الأجوبة:


يمكنك استعمال ال -ss خيار لتحديد الطابع الزمني للبدء ، و -t خيار لتحديد مدة التشفير. يجب أن تكون الطوابع الزمنية موجودة HH:MM:SS.xxx تنسيق أو في ثوان (s.msec).

سيؤدي المقطع التالي إلى قطع الثواني الـ 30 الأولى ، ثم قصاصة كل شيء بعد 10 ثوانٍ من ذلك:

ffmpeg -ss 00:00:30.0 -i input.wmv -c copy -t 00:00:10.0 output.wmv
ffmpeg -ss 30 -i input.wmv -c copy -t 10 output.wmv

لاحظ أن -t هو خيار الإخراج ويحتاج دائمًا إلى التحديد بعد  -i.

بعض النصائح:

  • للإصدارات القديمة من ffmpeg ، إذا كنت تستخدم -ss بعد -i، تحصل على البحث أكثر دقة على حساب أبطأ التنفيذ تماما. أنظر أيضا: البحث مع FFmpeg
  • يمكنك استخدام -to بدلا من -t لتحديد الطابع الزمني الذي تريد قطعه. لذا ، بدلا من -i <input> -ss 30 -t 10 يمكنك أيضا القيام به -i <input> -ss 30 -to 40 لتحقيق نفس الشيء.

  • إذا كان ffmpeg الخاص بك لا يدعم -cأو -to، فمن المرجح جدا عفا عليها الزمن. ترجمة نسخة جديدة نفسك أو تحميل بناء ثابت من صفحتهم الرئيسية. انها حقا ليست معقدة.


317
2018-05-15 00:03



Mondain في الواقع ، يمكنك الحصول على مزيد من الدقة في وضع -ss بعد. وتذكر slhck هذا هنا blog.superuser.com/2012/02/24/...  أيضا في وثائق ffmpeg - تشير إلى وجود اختلاف بين وضعها قبل أو بعد. - barlop
+1 جئت إلى هنا لمعرفة كيفية تجاهل كل شيء بعد أول 35 ثانية ، وذلك بفضل: ffmpeg -i input.wmv -c copy -t 35 output.wmv - karlphillip
هذا لا يعمل بالنسبة لي (MP4). ينتج فقط شاشة سوداء 5 ثانية: frame= 150 fps=0.0 q=-1.0 Lsize= 264kB time=00:00:09.97 bitrate= 216.6kbits/s - clocksmith
أنتجت هذه شاشة سوداء 3-4 ق في بداية مقطع الفيديو الخاص بي. تعديل كريس مع الحذف -c copy إزالة الشاشة السوداء الأولية ، انظر إجابته عن التفاصيل. - joelostblom
تكتب "ما يلي سوف مقطع أول 30 ثانية ، ومن ثم قصاصة كل ما هو 10 ثانية بعد ذلك:" <- ماذا يعني ذلك؟ مقطع تقصد تشمل؟ "كليب كوس يمكن أن يعني مقطع. على افتراض انك تعني تشمل. هل تقصد البدء من 30 ثانية ، وتضمين 10 ثوانٍ فقط من هناك؟ إذا كان الأمر كذلك ، فأقترح أن تكتب أنه سيكون أكثر وضوحًا. - barlop


كما ذكر آخرون ، ووضع -ss قبل (أسرع بكثير) أو بعد (أكثر دقة) -i تحدث فرقا كبيرا. يخبرك قسم "البحث السريع والدقيق" في صفحة طلب ffmpeg عن كيفية الحصول على كليهما ، وقد استخدمتهما ، ويحدث فرقًا كبيرًا. في الأساس كنت وضعت -ss قبل وبعد -i، فقط تأكد من ترك وقتًا كافيًا قبل أن تبدأ بالبدء في القطع للحصول على إطار رئيسي آخر. مثال: إذا كنت ترغب في عمل مقطع مدته دقيقة واحدة ، من 9min 0sec إلى 10min 0sec في Video.mp4 ، يمكنك القيام بذلك بسرعة وبدقة باستخدام:

ffmpeg -ss 00:08:00 -i Video.mp4 -ss 00:01:00 -t 00:01:00 -c copy VideoClip.mp4

الأول -ss يسعى بسرعة إلى (تقريبا) 8min0sec ، ثم الثاني -ss يسعى بدقة إلى 9min0sec ، و -t 00:01:00 يأخذ مقطع 1min0sec.

لاحظ أيضًا هذه النقطة المهمة من هذه الصفحة: "إذا كنت تستخدم -ss مع -c:v copy، قد يصبح تدفق البتات الناتج متقطعًا أو غير قابل للعب أو غير متزامن مع الدفق الصوتي ، حيث أن ffmpeg مضطر لاستخدام / تقسيم فقط على الإطارات. "

هذا يعني أنك بحاجة إلى إعادة ترميز الفيديو ، حتى إذا كنت تريد نسخه فقط ، أو تخاطر بأن يكون متقطعًا وغير متزامن. يمكنك أن تجرب فقط -c copy أولاً ، ولكن إذا تمتص الفيديو ، فستحتاج إلى إعادة تنفيذه.


78
2018-01-20 04:07



ينطبق نفس التحذير على -c:a copy لهذه الطريقة من البحث. - jiggunjer
أفضل إجابة ، هذه الطريقة عملت الأفضل بالنسبة لي. - Ondra Žižka
يبدو "-ss" الآن سريع ودقيق في ffmpeg 2.1+ بدون تحديده مرتين. trac.ffmpeg.org/wiki/Seeking - Conrad Meyer


لقد وجدت ذلك -ss مدموج مع -c copy نتج عنها فرم نصف ثانية في البداية.

لتجنب ذلك ، يجب عليك إزالة -c copy (والتي من المسلم به ستفعل ترانس كود).


18
2018-05-09 02:24



هناك إجابة أخرى تتناول الدقة. إعادة الترميز مع الخيار الافتراضي في كثير من الأحيان ليس ما تريد القيام به! - Tomasz Gandor
نقطة جيدةTomaszGandor - Chris
لم أفهم رد @ TomaszGandor على الإطلاق ، ولكن إزالة -c copy تم التصليح. - Iulian Onofrei


يدويا

افتح الملف في مشغل الوسائط الذي سيتم تأطيره بواسطة إطار مسبق وتشغيله ملف AVISynth مع بيانات مثل:

DirectShowSource(("C:\Downloads\Video\Do you want him.flv"), Pixel_Type="yuy2").Crop(0,0,-0,-0)
Subtitle("C:\Downloads\Video\Do you want him.flv", font="Arial", size=24, text_color=$ff0000, align=3)
ShowFrameNumber(scroll=true, x=336, y=27, font="Arial", size=24, text_color=$ff0000)
ShowTime(x=398, y=44, font="Arial", size=24, text_color=$ff0000)

بعد ذلك ، يمكنك القص باستخدام تنسيق الوقت الفعلي:

ffmpeg -i "Path\do you want him.flv"        \
       -ss 00:00:05.240 -to 00:00:08.360    \
       -vcodec libx264 -acodec libvo_aacenc \
       "Path\Do you want him1.flv"

و

ffmpeg -i "Path\do you want him.flv"        \
       -ss 00:00:10.240 -to 00:00:14.360    \
       -vcodec libx264 -acodec libvo_aacenc \
       "Path\Do you want him2.flv"

الآن قم بعمل ملف txt مع ملفات الفيديو بمحتويات مثل:

file 'C:\Downloads\Video\Do you want him1.flv'
file 'C:\Downloads\Video\Do you want him2.flv'

تشغيل ffmpeg:

ffmpeg -f concat -i FileList.txt -c copy "Path\NewName_joined.flv"

13
2017-09-04 05:48





لي -t الخيار لم ينجح ، ولكن -vframes عمل. أنا أفضل استخدام #frames، لأنني أفضل قطع في I-Frames واكتشفت GOP للفيديو باستخدام ffprobe.

سطر الأوامر الذي يعمل بالنسبة لي هو:

ffmpeg -ss 60s -i input.wmv -vframes 1800 -acodec copy -vcodec copy output.wmv

بالمناسبة ، وضع -ss في الجزء الأمامي من -i تحدث فرقا كبيرا في وقت التنفيذ.


7
2018-05-19 03:14



في الواقع -vframes (أو -frames:v) يجب أن تأتي بعد -i لأنه خيار الإخراج. - slhck


كما هو الحال مع user225366 ، لا يعمل الخيار -t لمقاطع الفيديو القصيرة ، ولكنه يعمل لمقاطع الفيديو الطويلة. لمقاطع الفيديو القصيرة يبدو أن -Frames: v أفضل. هذا ما نجح بالنسبة لي.

ffmpeg -ss 4 -i input.mp4 -frames:v 200 -vcodec copy output.mp4

تحتاج النسخة -acodec إلى إضافتها إذا كان الفيديو يحتوي على صوت ، كما تظهر الإجابات الأخرى.


3
2017-12-08 11:24