इंटरएक्टिव रूप से वीडियो फ़ाइलों को संक्षिप्त करें


9

इंटरेक्टिव रूप से एक फाइल में कई MP4 वीडियो फ़ाइलों को कैसे सम्मिलित करें (सम्मिलित करें)?

कई प्रोग्राम हैं जो कमांड लाइन से दो फ़ाइलों के लिए ऐसा करते हैं। उदाहरण के लिए:

  • ffmpeg
  • avconv
  • MP4Box

लेकिन हमें इसे अंतःक्रियात्मक रूप से करने के लिए अक्सर एक समाधान की आवश्यकता होती है।


1
क्या आप बता सकते हैं कि इंटरएक्टिव से आपका क्या मतलब है?
स्लम

@ एसएलएम मेरा मतलब है कि एक प्रोग्राम जो उपयोगकर्ता को एक-एक करके इनपुट फ़ाइलों को दर्ज करने के लिए कहता है, फिर आउटपुट फाइल बनाने के लिए। और फिर संघ बनाना।
4

मैंने कभी ऐसा प्रोग्राम नहीं देखा जो सीधे तौर पर ऐसा करता हो, जैसा कि आपने गढ़ा है, एक शेल स्क्रिप्ट जो जानकारी एकत्र करती है और फिर कमांड-लाइन को असेंबल करती है। क्या आपके पास जो कुछ है उसमें सुधार की तलाश कर रहे हैं?
स्लम

@ एसएलएम मैंने इसे पोस्ट किया क्योंकि यह मेरे जैसे मल्टीमीडिया उपयोगकर्ताओं की लगातार आवश्यकता है। इसलिए मुझे उम्मीद है कि यह किसी और की मदद करेगा। बेशक किसी भी सुधार का स्वागत से अधिक है!
स्लीक्स

1
@ मैं एक कतार में एक संपादन डाल दिया। ffmpegद्वारा वास्तव में है किसी भी तरह मृत या अप्रचलित: पिछले gitकरने के लिए प्रतिबद्ध masterथा 15 मिनट पहले और मैं इसे दैनिक उपयोग करें।
अंको

जवाबों:


8

मैंने हाल ही में इस विधि की कोशिश नहीं की है, लेकिन यह नहीं देखता कि यह अभी भी काम क्यों नहीं करेगा। मेरा मानना ​​है कि आप केवल cat .mp4एक साथ फाइल कर सकते हैं यदि आप उन्हें संक्षिप्त करने के अलावा कुछ नहीं करना चाहते हैं।

1. बिल्ली का उपयोग करना

$ cat file1.mp4 file2.mp4 > file3.mp4
$ ffmpeg -i file3.mp4 -qscale:v 2 output.avi

मैं अभी भी ffmpegहर समय उपयोग करता हूं , यह भी फाइलों को समाप्‍त कर सकता है।

2. ffmpeg का उपयोग करना

  1. संक्षिप्त करने के लिए फ़ाइलों की एक सूची बनाएं

    $ cat inputs.txt 
    file sample_mpeg4.mp4
    file sample_mpeg4.mp4
    
  2. CONCATENATE

    $ ffmpeg -f concat -i inputs.txt -c copy out.mp4
    
    $ ll |grep -E "sample|out"
    -rw-rw-r--. 1 saml saml 491860 Feb 19 23:36 out.mp4
    -rw-r--r--. 1 saml saml 245779 Feb 19 23:32 sample_mpeg4.mp4
    

    अन्य तरीकों को एफएफएमपी विकी में कवर किया गया है: मीडिया फ़ाइलों को कैसे सम्मिलित करें ( सम्मिलित करें, मर्ज करें)

    नोट: Ubuntu concatप्रारूप का समर्थन करने के लिए प्रकट नहीं होता है । आपको कॉनकट प्रोटोकॉल का उपयोग करना होगा। इसके अलावा, इसमें प्रति स्ट्रीम कोडेक विकल्प हैं। इस प्रकार, कॉनकैट प्रोटोकॉल के परिणाम निम्नानुसार हैं:

    $ ffmpeg -i input1.mp4 -vcodec copy -acodec copy \
         -vbsf h264_mp4toannexb -f mpegts intermediate1.ts
    
    $ ffmpeg -i input2.mp4 -vcodec copy -acodec copy \
         -vbsf h264_mp4toannexb -f mpegts intermediate2.ts
    
    $ ffmpeg -i "concat:intermediate1.ts|intermediate2.ts" \
         -vcodec copy -acodec copy -absf aac_adtstoasc output.mp4
    

    उबंटू ffmpeg विकल्प यहां प्रलेखित हैं


दिलचस्प है! मुझे नहीं पता था कि catMP4 फ़ाइलों के लिए पर्याप्त है! समाधान हालांकि इंटरैक्टिव नहीं है!
स्लीक्स

@Slyx - हाँ, यही कारण है कि मैंने पूछा कि आप इंटरैक्टिव से क्या मतलब है। इसके बारे में आपने जो कहा है, उसे देखने दीजिए और देखिए कि मैं इससे क्या जोड़ सकता हूं। catहालांकि काम करता है की जाँच करें । पिछली बार जब मैंने इसे इस्तेमाल किया था, तो यह .mpgफाइलों के साथ था और यह खराब हो गया। उन लोगों के साथ काम किया।
स्लम

2
मैंने सत्यापित किया कि उपयोग करना catएक वैध समाधान नहीं है। catदो फ़ाइल आईएनजी द्वारा उत्पन्न फ़ाइल केवल पहली इनपुट फ़ाइल की सामग्री को दिखाती है!
स्लीक्स

@ स्लीक्स - बिल्ली काम करती है, लेकिन टाइमस्टैम्प सही नहीं है, इसलिए जब आप इसे वापस खेलने का प्रयास करते हैं तो वीडियो प्लेयर टाइमस्टैम्प में 00 से अंत तक कूदने से भ्रमित हो रहा है, फिर वापस 00 तक। यदि आप इस वीडियो को ट्रांसकोड करने के लिए थे उस प्रक्रिया के हिस्से के रूप में तय हो जाएगा। टाइमस्टैम्प को फिर से बनाने के तरीके भी हैं।
स्लम

मेरा भी यही मतलब है। दो सामग्री हैं, लेकिन मीडिया प्लेयर सिर्फ पहले वाले का पता लगाता है।
स्लीक्स

4

मैं काम के आधार के रूप में MP4Box का उपयोग करता हूं।
मेरे द्वारा सुझाई गई स्क्रिप्ट एक-एक करके सभी फाइलों को पढ़ती है, हर एक की पुष्टि करती है (मौसम यह एक साधारण फ़ाइल है), उपयोगकर्ता से इनपुट फ़ाइल नाम बनाने के लिए कहता है।

#!/bin/bash
printf "###  Concatenate Media files ###\n"
fInputCount=0
# Reading input files
IFS=''
while (true)
do
    let currentNumber=$fInputCount+1 
    printf "File n°%s (\"ok\" to finish): " $currentNumber
    read inputFile
    [ "$inputFile" == "ok" ] && break
    [ ! -e "$inputFile" ] || [ ! -f "$inputFile" ] && printf "\"%s\" : Invalid filename. Skipped !\n" "$inputFile" && continue
    ((fInputCount++))
    inputFileList[$fInputCount]=$inputFile
    printf "\"%s\" : Added to queue !\n" "$inputFile"
done
[ "$fInputCount" == "0" ] || [ "$fInputCount" == "1" ] && echo "No enough input data. BYE ! " && exit
# Listing the input file list 
for ((i=1;i<=$fInputCount;i++))
do
    printf "%2d : %s\n" $i ${inputFileList[$i]}
done
# Reading the output filename
while (true)
do
    printf "Output file without extention (\"none\" to dismiss) : "
    read outputRead
    [ "$outputRead" == "none" ] && echo "Dismissed. BYE ! " && exit
    [ "$outputRead" == "" ] && echo "Try again ! " && continue
    [ -e "$outputRead" ] && echo "\"$outputRead\" exists. Try again !" && continue
    outputFile=$outputRead.mp4
    echo "Output to \"$outputFile\". Go !" && break
done
# Creating a random temporary filename
tmpOutFile="/tmp/concatMedia"`date +"%s%N"| sha1sum | awk '{print $1}'`".mp4"
# Joining the two first input files
MP4Box -cat "${inputFileList[1]}" -cat "${inputFileList[2]}" $tmpOutFile
# Adding all other files
for ((i=3;i<=$fInputCount;i++))
do
    tmpIntermediateFile=$tmpOutFile
    tmpOutFile="/tmp/concatMedia"`date +"%s%N"| sha1sum | awk '{print $1}'`".mp4"
    MP4Box -cat $tmpIntermediateFile -cat "${inputFileList[$i]}" $tmpOutFile
    rm $tmpIntermediateFile
done
mv $tmpOutFile "$outputFile"
# Finished
echo "\"$outputFile\" Saved !"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.