FFmpeg: कुशलतापूर्वक वीडियो कैसे विभाजित करें?


103

मैं एक बड़े एवी वीडियो को दो छोटे लगातार वीडियो में विभाजित करना चाहता हूं। मैं ffmpeg का उपयोग कर रहा हूं।

एक तरह से दो बार ffmpeg चलाने के लिए है:

ffmpeg -i input.avi -vcodec copy -acodec copy -ss 00:00:00 -t 00:30:00 output1.avi
ffmpeg -i input.avi -vcodec copy -acodec copy -ss 00:30:00 -t 00:30:00 output2.avi

लेकिन ffmpeg के मैनपेज के अनुसार, मैं केवल एक लाइन का उपयोग करके एक इनपुट फ़ाइल से एक से अधिक ouput फ़ाइल बना सकता हूं :

ffmpeg -i input.avi -vcodec copy -acodec copy -ss 00:00:00 -t 00:30:00 output1.avi \
   -vcodec copy -acodec copy -ss 00:30:00 -t 00:30:00 output2.avi

मेरा सवाल है, क्या बाद के दृष्टिकोण से गणना समय और मेमोरी बचती है?


3
"-vcodec copy -acodec copy" का उपयोग करते समय यह बहुत तेज़ होता है :))
सवस आडार

@ एंटोनी, आप दोनों संस्करणों का समय क्यों नहीं निकालते (और मेमोरी मॉनिटर जैसे देख सकते हैं htop), और हमें बताएं कि उत्तर क्या है?
अलक्यूबिएरेड्राइव

पहला उदाहरण इसे क्रमिक रूप से करता है, जबकि दूसरा उदाहरण थ्रेड्स का उपयोग करता है। दोनों एक ही काम करेंगे, कोई ध्यान देने योग्य स्पीडअप नहीं होना चाहिए। लेकिन चीजों को सरल बनाने के लिए, आप ffmpeg स्ट्रीम सेगमेंट muxer का उपयोग कर सकते हैं: ffmpeg.org/…
Mladen B.

1
यह उदाहरण बुरी तरह से गलत लगता है! Ffmpeg दस्तावेज़ीकरण -ss विकल्प के बारे में कहता है: "जब एक इनपुट विकल्प (-i) के रूप में उपयोग किया जाता है, तो इस इनपुट फ़ाइल में स्थिति की तलाश की जाती है। जब आउटपुट विकल्प (आउटपुट फ़ाइल नाम से पहले) के रूप में उपयोग किया जाता है, तब तक इनपुट को डिकोड करता है, लेकिन तब तक इनपुट करता है। टाइमस्टैम्प स्थिति तक पहुँचते हैं। " आप इसे आउटपुट स्थिति में उपयोग कर रहे हैं, इसलिए आपकी दूसरी पंक्ति प्रयास को डिकोड करने और पहले 30 मिनट को छोड़ने में बर्बाद कर देती है।
लुसियन विस्किक

1
@LucianWischik लेकिन -ssदूसरे विभाजन में इनपुट विकल्प के रूप में उपयोग करना सटीक नहीं हो सकता है, इसलिए आपको एक साफ़ विभाजन नहीं मिल सकता है। ओपी द्वारा आईएमओ का उदाहरण अधिक सही है।
जिगगंजर

जवाबों:


82

Ffmpeg wiki "इस वीडियो को कुशलतापूर्वक कैसे विभाजित करें" के संदर्भ में इस पृष्ठ पर वापस लिंक करता है। मुझे यकीन नहीं है कि यह पृष्ठ उस प्रश्न का उत्तर देता है, इसलिए मैंने @AlcubierreDrive का सुझाव दिया था ...

echo "Two commands" 
time ffmpeg -v quiet -y -i input.ts -vcodec copy -acodec copy -ss 00:00:00 -t 00:30:00 -sn test1.mkv
time ffmpeg -v quiet -y -i input.ts -vcodec copy -acodec copy -ss 00:30:00 -t 01:00:00 -sn test2.mkv
echo "One command" 
time ffmpeg -v quiet -y -i input.ts -vcodec copy -acodec copy -ss 00:00:00 -t 00:30:00 \
  -sn test3.mkv -vcodec copy -acodec copy -ss 00:30:00 -t 01:00:00 -sn test4.mkv

कौन सा आउटपुट ...

Two commands
real    0m16.201s
user    0m1.830s
sys 0m1.301s

real    0m43.621s
user    0m4.943s
sys 0m2.908s

One command
real    0m59.410s
user    0m5.577s
sys 0m3.939s

मैंने कुछ रन और थोड़ा गणित के बाद, एक एसडी और एचडी फ़ाइल का परीक्षण किया।

Two commands SD 0m53.94 #2 wins  
One command  SD 0m49.63  

Two commands SD 0m55.00  
One command  SD 0m52.26 #1 wins 

Two commands SD 0m58.60 #2 wins  
One command  SD 0m58.61 

Two commands SD 0m54.60  
One command  SD 0m50.51 #1 wins 

Two commands SD 0m53.94  
One command  SD 0m49.63 #1 wins  

Two commands SD 0m55.00  
One command  SD 0m52.26 #1 wins 

Two commands SD 0m58.71  
One command  SD 0m58.61 #1 wins

Two commands SD 0m54.63  
One command  SD 0m50.51 #1 wins  

Two commands SD 1m6.67s #2 wins  
One command  SD 1m20.18  

Two commands SD 1m7.67  
One command  SD 1m6.72 #1 wins

Two commands SD 1m4.92  
One command  SD 1m2.24 #1 wins

Two commands SD 1m1.73  
One command  SD 0m59.72 #1 wins

Two commands HD 4m23.20  
One command  HD 3m40.02 #1 wins

Two commands SD 1m1.30  
One command  SD 0m59.59 #1 wins  

Two commands HD 3m47.89  
One command  HD 3m29.59 #1 wins  

Two commands SD 0m59.82  
One command  SD 0m59.41 #1 wins  

Two commands HD 3m51.18  
One command  HD 3m30.79 #1 wins  

एसडी फाइल = 1.35GB DVB ट्रांसपोर्ट स्ट्रीम
HD फाइल = 3.14GB DVB ट्रांसपोर्ट स्ट्रीम

निष्कर्ष

एकल कमांड बेहतर है यदि आप एचडी को संभाल रहे हैं, तो यह इनपुट फाइल के बाद 'धीमी गति से काम करने' के लिए -s का उपयोग करने पर मैनुअल टिप्पणियों से सहमत है। एसडी फ़ाइलों में एक नगण्य अंतर है।

दो कमांड संस्करण को एक तेज गति के लिए इनपुट फ़ाइल से पहले एक और-एस को जोड़कर तेज होना चाहिए, इसके बाद अधिक सटीक धीमी गति से तलाश करना चाहिए।


यदि TS में कई प्रोग्राम (DVB-T द्वारा कैप्चर किए गए टीवी प्रोग्राम) हैं, तो इसे कैसे विभाजित किया जा सकता है? उदाहरण के लिए मेरे पास एक TS फाइल है जिसमें फुटबॉल + कुकिंग + कार्टून है। मैं इस TS फाइल को 3 mpg फाइलों में कैसे विभाजित कर सकता हूं?
डॉ। जकी

मैंने यहाँ आपके प्रश्न में अपने उत्तर का उपयोग किया ( stackoverflow.com/questions/41983940/… ) लेकिन यह काम नहीं किया, आपको क्या लगता है कि मैं गलत कर रहा हूँ?
15

1
परिणाम फ़ाइल मेरे मामले में कोई वीडियो (केवल ऑडियो) के साथ थी। कुछ प्रयोगों के बाद मुझे आत्मीयता मिली। इसे इस तरह "गुणवत्ता को संशोधित न करें" के लिए कुंजी निर्दिष्ट करने की आवश्यकता है -q:v 0
ओक्लास

19

यहां एक उपयोगी स्क्रिप्ट है, यह आपको स्वचालित रूप से विभाजित करने में मदद करता है: ffmpeg का उपयोग करके वीडियो को विभाजित करने के लिए एक स्क्रिप्ट

#!/bin/bash
 
# Written by Alexis Bezverkhyy <alexis@grapsus.net> in 2011
# This is free and unencumbered software released into the public domain.
# For more information, please refer to <http://unlicense.org/>
 
function usage {
        echo "Usage : ffsplit.sh input.file chunk-duration [output-filename-format]"
        echo -e "\t - input file may be any kind of file reconginzed by ffmpeg"
        echo -e "\t - chunk duration must be in seconds"
        echo -e "\t - output filename format must be printf-like, for example myvideo-part-%04d.avi"
        echo -e "\t - if no output filename format is given, it will be computed\
 automatically from input filename"
}
 
IN_FILE="$1"
OUT_FILE_FORMAT="$3"
typeset -i CHUNK_LEN
CHUNK_LEN="$2"
 
DURATION_HMS=$(ffmpeg -i "$IN_FILE" 2>&1 | grep Duration | cut -f 4 -d ' ')
DURATION_H=$(echo "$DURATION_HMS" | cut -d ':' -f 1)
DURATION_M=$(echo "$DURATION_HMS" | cut -d ':' -f 2)
DURATION_S=$(echo "$DURATION_HMS" | cut -d ':' -f 3 | cut -d '.' -f 1)
let "DURATION = ( DURATION_H * 60 + DURATION_M ) * 60 + DURATION_S"
 
if [ "$DURATION" = '0' ] ; then
        echo "Invalid input video"
        usage
        exit 1
fi
 
if [ "$CHUNK_LEN" = "0" ] ; then
        echo "Invalid chunk size"
        usage
        exit 2
fi
 
if [ -z "$OUT_FILE_FORMAT" ] ; then
        FILE_EXT=$(echo "$IN_FILE" | sed 's/^.*\.\([a-zA-Z0-9]\+\)$/\1/')
        FILE_NAME=$(echo "$IN_FILE" | sed 's/^\(.*\)\.[a-zA-Z0-9]\+$/\1/')
        OUT_FILE_FORMAT="${FILE_NAME}-%03d.${FILE_EXT}"
        echo "Using default output file format : $OUT_FILE_FORMAT"
fi
 
N='1'
OFFSET='0'
let 'N_FILES = DURATION / CHUNK_LEN + 1'
 
while [ "$OFFSET" -lt "$DURATION" ] ; do
        OUT_FILE=$(printf "$OUT_FILE_FORMAT" "$N")
        echo "writing $OUT_FILE ($N/$N_FILES)..."
        ffmpeg -i "$IN_FILE" -vcodec copy -acodec copy -ss "$OFFSET" -t "$CHUNK_LEN" "$OUT_FILE"
        let "N = N + 1"
        let "OFFSET = OFFSET + CHUNK_LEN"
done

2
आपके लिए SEARAS की भी यही टिप्पणी है। बैच फ़ाइलों को लिखना तब आवश्यक होता है, जब आपकी आवश्यकता हो और जब आपके पास कोई अन्य विकल्प उपलब्ध न हो, क्योंकि यह पोर्टेबल नहीं है। उदाहरण के लिए, आप विंडोज पर एक ही स्क्रिप्ट नहीं चला पाएंगे। जब अधिक सामान्य / पोर्टेबल तरीके होते हैं, तो बैच स्क्रिप्ट से बचा जाना चाहिए, ताकि उन्हें पोर्ट करने के लिए आवश्यक समय को बचाया जा सके। चूंकि ffmpeg के पास इस समस्या को हल करने के कई तरीके हैं, इसलिए उचित तरीका यह होगा कि स्क्रिप्ट की मदद के बिना, अकेले ffmpeg का उपयोग किया जाए।
म्लादेन बी।

अच्छी स्क्रिप्ट है। क्या आपने इसे लिखा था? यह GitHub पर है? मैं कुछ सुझाव देना चाहूंगा :)
आवाज़ें

mp4 के लिए, दृश्य क्षतिग्रस्त हैं। बेहतर प्रति के साथ बदलें: -vcodec libx264 -acodec aac
kishu

8

मेरे अनुभव में, विभाजन / शामिल होने के लिए ffmpeg का उपयोग न करें। MP4Box, ffmpeg की तुलना में तेज और हल्का है। कृपया कोशिश करें। उदाहरण के लिए, यदि आप एक 1400mb MP4 फ़ाइल को दो भागों में विभाजित करना चाहते हैं तो 700mb आप निम्न cmdl का उपयोग कर सकते हैं: MP4Box -splits 716800 input.mp4 उदाहरण के लिए आप उपयोग कर सकने वाली दो फाइलों को समाप्‍त करने के लिए:

MP4Box -cat file1.mp4 -cat file2.mp4 output.mp4

या यदि आपको समय से विभाजन की आवश्यकता है, तो उपयोग करें -splitx StartTime:EndTime:

MP4Box -add input.mp4 -splitx 0:15 -new split.mp4


यह वही था जो मुझे चाहिए था! जब मैं ffmpeg के साथ कट रहा था, क्लिप keyframes पर शुरू नहीं किया था और सिरों पर अजीब जमाव था। MP4Box -splitz का उपयोग कर चाल किया!
मैट

1
मैं कई संख्याओं के साथ Mp4Box का उपयोग करके वीडियो को कैसे ट्रिम कर सकता हूं? उदाहरण के लिए मुझे सेकंड में उप क्लिप की आवश्यकता है: 5 - 8, 21 - 30, 12 - 18 इसलिए मुझे तीन आउटपुट वीडियो फ़ाइल की आवश्यकता है।
मेहंददेव

और की EndTimeतुलना में उपयोग करने के लिए बहुत आसान है -t
vmassuchetto

6

http://ffmpeg.org/trac/ffmpeg/wiki/Seeking%20with%20FFmpeg भी आपके लिए उपयोगी हो सकता है। इसके अलावा ffmpeg में एक सेगमेंट muxer है जो काम कर सकता है।

वैसे भी मेरा अनुमान है कि उन्हें एक कमांड में मिलाने से समय की बचत होगी।


2

क्या बाद का दृष्टिकोण गणना समय और मेमोरी को बचाता है?

आपके द्वारा प्रदान किए गए उन दो उदाहरणों के बीच कोई बड़ा अंतर नहीं है। पहला उदाहरण वीडियो को क्रमिक रूप से 2 चरणों में काटता है, जबकि दूसरा उदाहरण उसी समय (थ्रेड का उपयोग करके) करता है। कोई विशेष गति अप ध्यान देने योग्य नहीं होगी। आप FFmpeg के साथ कई आउटपुट बनाने के बारे में अधिक पढ़ सकते हैं

इसके अलावा, आप (हाल के FFmpeg में) क्या उपयोग कर सकते हैं, स्ट्रीम सेगमेंट मक्सर है जो कर सकते हैं:

आउटपुट लगभग निश्चित अवधि की अलग-अलग फ़ाइलों की संख्या में स्ट्रीम करता है। आउटपुट फ़ाइलनाम पैटर्न को छवि 2 के समान फैशन में सेट किया जा सकता है ।


2

यहां आने वाली फ़ाइल को 50 भागों में विभाजित करने के लिए एक सरल विंडोज बैट फ़ाइल है। प्रत्येक भाग की लंबाई 1 मिनट है। ऐसी गूंगी स्क्रिप्ट के लिए क्षमा करें। मुझे आशा है कि यह बेहतर है कि डंब विंडोज़ स्क्रिप्ट के बजाय यह बिल्कुल न हो। शायद यह किसी की मदद करे। (इस साइट से "लूप के लिए बैट फाइल" पर आधारित है।)

set var=0
@echo off
:start
set lz=
if %var% EQU 50 goto end
if %var% LEQ 9 set lz=0
echo part %lz%%var%
ffmpeg -ss 00:%lz%%var%:00 -t 00:01:00 -i %1 -acodec copy -vcodec copy %2_%lz%%var%.mp4
set /a var+=1
goto start

:end
echo var has reached %var%.
exit

यह अनिवार्य ffmpegरूप से लूप के रूप में लिखे गए प्रश्न (लगातार कमांड) में पहला कोड स्निपेट है । यह इस सवाल का जवाब नहीं देता है कि क्या यह दृष्टिकोण या एक कमांड "गणना समय और मेमोरी को बचाएगा"।
BACON

1

Ist का परीक्षण नहीं किया, लेकिन यह आशाजनक लगता है:

मूल धारा खंड

यह स्पष्ट रूप से एवीआई को एक ही आकार के खंडों में विभाजित कर रहा है, जिसका अर्थ है कि ये हिस्सा ढीली गुणवत्ता नहीं बढ़ाते हैं या स्मृति में वृद्धि नहीं करते हैं या पुनर्गणना होनी चाहिए।

यह कोडेक कॉपी का उपयोग भी करता है - इसका मतलब यह है कि यह बहुत बड़ी धाराओं को संभाल सकता है? क्योंकि यह मेरी समस्या है, मैं अपने एवी को तोड़ना चाहता हूं ताकि मैं एक फिल्टर का उपयोग कर सकता हूं ताकि गड़बड़ी से छुटकारा पा सके। लेकिन एक पूरी एवी घंटों चलती है।


-1

यहाँ वीडियो को विभाजित करने का एक सही तरीका है। मैंने इसे पहले किया है, और यह मेरे लिए अच्छा काम कर रहा है।

ffmpeg -i C:\xampp\htdocs\videoCutting\movie.mp4 -ss 00:00:00 -t 00:00:05 -async 1 C:\xampp\htdocs\videoCutting\SampleVideoNew.mp4 (सीएमडी के लिए)। shell_exec('ffmpeg -i C:\xampp\htdocs\videoCutting\movie.mp4 -ss 00:00:00 -t 00:00:05 -async 1 C:\xampp\htdocs\videoCutting\SampleVideoNew.mp4')(php के लिए)।

कृपया इसका अनुसरण करें और मुझे यकीन है कि यह पूरी तरह से काम करेगा।


वीडियो को विभाजित करने का यह "सही तरीका" क्यों है? सवाल में कमांड लाइन की तरह, आप दे रहे -iद्वारा पीछा किया -ssऔर -t। सवाल यह है कि एक ही इनपुट फ़ाइल से कई खंडों को कुशलतापूर्वक कैसे निकाला जाए, हालांकि, आप केवल एक खंड को निकाल रहे हैं। मैं यह नहीं देखता कि यह सवाल का जवाब कैसे देता है।
BACON

-2

एक सरल तरीका यह है कि पबलाइटियो url- आधारित एपीआई के साथ ट्रिम विकल्प का उपयोग करें ।

एक बार जब आप अपना वीडियो अपलोड कर लेते हैं, तो बस url (so_2, eo_2) में ऑफ़सेट स्टार्ट एंड ऑफ़ ऑफसेट सेट करें:

    https://media.publit.io/file/so_2,eo_2/tummy.mp4

यह 2 सेकंड और लंबाई में 2 सेकंड से शुरू होने वाले तुरंत नए वीडियो बनाएगा। आप वैसे भी इस तरह से वीडियो को विभाजित कर सकते हैं।


प्रश्न पूछ रहा है कि इनपुट फ़ाइल से कई सेगमेंट निकालने के लिए दो तरीकों में से कौन सा अधिक कुशल है ffmpeg। जब तक आपके पास वास्तव में, वास्तव में तेजी से इंटरनेट कनेक्शन नहीं है, मुझे लगता है कि पूरे वीडियो को क्लाउड सेवा पर अपलोड करना होगा और फिर परिणाम डाउनलोड करने के लिए प्रसंस्करण समय में काफी वृद्धि होगी। फिर भी, यह अभी भी इस सवाल का जवाब नहीं देता है कि किस दृष्टिकोण के साथffmpeg अधिक कुशल है।
BACON
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.