हैंडब्रेक एक कमाल का वीडियो कम्प्रेशन टूल है, लेकिन यह वीडियो कैप्चर होने के बाद मूल कैप्चर टाइम को संरक्षित करने के लिए प्रतीत नहीं होता है। इसे ठीक करने के लिए कोई भी विचार?
हैंडब्रेक एक कमाल का वीडियो कम्प्रेशन टूल है, लेकिन यह वीडियो कैप्चर होने के बाद मूल कैप्चर टाइम को संरक्षित करने के लिए प्रतीत नहीं होता है। इसे ठीक करने के लिए कोई भी विचार?
जवाबों:
आप FFmpeg का उपयोग करके वीडियो को फिर से एनकोड करने की आवश्यकता के बिना मौजूदा मेटाडेटा को एक फ़ाइल से दूसरी फ़ाइल में कॉपी कर सकते हैं । यह मूल रूप से एक सेकंड लेता है। ऐसा करने के लिए, मान लें कि तीन फाइलें हैं:
in.mp4
- रूपांतरण से पहले मूल फ़ाइलout.mp4
- हैंडब्रेक रूपांतरण के बाद फाइलfixed.mp4
- "सही" मेटाडाटा के साथ फाइलFFmpeg कमांड पूरी मेटाडेटा रिकॉर्ड को नई फ़ाइल में कॉपी करने के लिए होगी:
ffmpeg -i in.mp4 -i out.mp4 -map 1 -map_metadata 0 -c copy fixed.mp4
इसे तोड़ने के लिए, यह निम्नलिखित है:
in.mp4
और out.mp4
) लें, जिन्हें क्रमशः आईडी 0 और 1 सौंपा गया है।-map 1
), इसलिए हम पहले से परिवर्तित बिटस्ट्रीम लेते हैं-map_metadata 0
)-c copy
वीडियो को पुनः एन्कोडिंग करने के बजाय सभी बिटस्ट्रीम को कॉपी करने के लिए कॉपी कोडेक ( ) का उपयोग करें ।उसके बाद, आप स्पष्ट रूप से नाम बदल fixed.mp4
सकते हैं out.mp4
।
एक उदाहरण के रूप में, यहाँ मेरी मूल फ़ाइल के मेटाडेटा रिकॉर्ड का हिस्सा है:
$ mediainfo in.mp4 | grep "Encoded date" | head -n 1
Encoded date : UTC 2012-01-08 11:16:19
हैंडब्रेक रूपांतरण के बाद यहाँ फ़ाइल है:
$ mediainfo out.mp4 | grep "Encoded date" | head -n 1
Encoded date : UTC 2012-12-24 11:39:35
मेटाडेटा की मैपिंग के बाद यहां अंतिम फाइल है:
$ ffmpeg -i in.mp4 -i out.mp4 -map 1 -map_metadata 0 -c copy fixed.mp4
[…]
$ mediainfo fixed.mp4 | grep "Encoded date" | head -n 1
Encoded date : UTC 2012-01-08 11:16:19
वास्तव में, आपको वास्तव में हैंडब्रेक का उपयोग करने की आवश्यकता नहीं है यदि आप FFmpeg का उपयोग कर सकते हैं, जो हैंडब्रेक वैसे भी निर्भर करता है। सबसे सरल मामले में आप अपना रूपांतरण इस तरह कर सकते हैं:
ffmpeg -i in.mp4 -c:v libx264 -crf 23 -c:a aac -map_metadata 0 out.mp4
यह x264 एनकोडर और AAC ऑडियो के साथ इनपुट को आउटपुट फ़ाइल में बदल देगा, मूल मेटाडेटा की नकल करेगा। आउटपुट की गुणवत्ता को बदलने के लिए, आप कर सकते हैं:
अधिक के लिए FFmpeg विकि पर x264 एन्कोडिंग गाइड पढ़ें ।
Unknown encoder 'libfaac'
त्रुटि दी
-c:a aac -strict experimental
इसके बजाय कोशिश करें ।
दुर्भाग्य से ऐसा लगता है कि हैंडब्रेक इसे अपने दम पर नहीं कर सकता है, लेकिन इसी तरह ffmpeg उदाहरण के लिए, टाइमस्टैम्प को touch
यूनिक्स कमांड का उपयोग करके संपीड़न के बाद मूल से कॉपी किया जा सकता है :
touch -r MVI_1234.MOV compressed_MVI_1234.m4v
यह दी गई संदर्भ फ़ाइल के समान ही संपीड़ित फ़ाइल पर टाइमस्टैम्प सेट करेगा।
मुझे ऐसा करने का एक आसान तरीका मिला, एक अलग सॉफ्टवेयर का उपयोग करके Adapter
: http://www.macroplant.com/adcape/
इसमें हैंडब्रेक जैसी सभी उन्नत सेटिंग्स नहीं हैं, लेकिन यह काम करता है (ffmpeg का उपयोग करके भी) और मेटाडाटा को मेरी आवश्यकता है।
मैं macOS Yosemite और HandBrakeBatch का उपयोग कर रहा हूं - इसका उपयोग फ़ाइलों को परिवर्तित करने के लिए करता हूं , लेकिन "प्राथमिकताएं" मेनू में "फ़ाइल निर्माण और संशोधन तिथियां" बॉक्स पर क्लिक करें।
फिर, मैं लाइटरूम 5 में वीडियो आयात करता हूं, लेकिन वे अभी भी निर्माण की तारीखों को नहीं रखते हैं। लेकिन, सबसे महत्वपूर्ण बात, फाइल्स को सही क्रिएशन डेट के साथ फाइंडर में दिखाया गया है। इसलिए मैंने उन सभी को लाइटरूम लाइब्रेरी → मेटाडेटा (राइट डायलॉग कॉलम) → कैप्चर टाइम → फ़ाइल के निर्माण की तिथि में परिवर्तन: सभी का चयन किया।
मेरे पास 850 पुराने पारिवारिक वीडियो थे - मुझे यह प्रक्रिया 100 बैचों में करनी थी। बहुत सी फाइलों के साथ हैंडब्रेक क्रैश।
मैंने एक बैश स्क्रिप्ट बनाई जो कि touch
उपर्युक्त सुझाव के अनुसार उपयोग करके मेटाडेटा को स्थानांतरित कर सकती है। इसके लिए काम करने के लिए आपके पास अलग-अलग निर्देशिकाओं पर आपकी मूल और रूपांतरित फाइलें होनी चाहिए, प्रत्येक में समान संख्या में फाइलें (निर्देशिकाओं में केवल वीडियो फाइलें होनी चाहिए, क्योंकि अन्य फाइलें / निर्देशिकाएं हस्तक्षेप करेंगी) और उसी क्रम में। फिर यह सिर्फ मेटाडेटा की प्रतिलिपि बनाता है और आप सभी सेट और काम कर रहे हैं। स्क्रिप्ट सभी फ़ाइल जोड़े को सूचीबद्ध करती है ताकि आप अंत में त्रुटियों के लिए जाँच कर सकें।
कोड सबसे साफ नहीं हो सकता है क्योंकि यह मेरी पहली उचित बैश स्क्रिप्ट थी, लेकिन यह मेरे लिए बहुत तेज़ और स्थिर रही है, इसलिए यहाँ है:
#!/bin/bash
#Sets IFS to \n to allow for filenames with spaces
IFS=$'\n'
#Source directory and converted direcotry
dir1=$1
dir2=$2
#Array with source filepaths
srcf=()
#Array with converted filepaths
cnvf=()
#Adds filepaths from the source directory to srcf array
for file in $(ls -1 $dir1); do
srcf+=("$dir1/$file")
done
#Adds filepaths from the converted directory to cnvf array
for file in $(ls -1 $dir2); do
cnvf+=("$dir2/$file")
done
#Checks if source and convert folders have the same number of files
if [ ${#srcf[*]} -eq ${#cnvf[*]} ]
then
#Counter variable
fnum=0
#Loops through the arrays and runs touch command on pairs of files to transfer the metadata
while [ $fnum -lt ${#srcf[*]} ]; do
echo $fnum
echo ${srcf[$fnum]} ${cnvf[$fnum]}
touch -r ${srcf[$fnum]} ${cnvf[$fnum]}
((fnum++))
done
else
echo "The provided paths do not have the same number of files. Both paths must have the same number of files in the same order."
fi
चलाने के लिए: sudo bash script.sh /sourcedir /converteddir
यदि आप फ़ाइल-स्तर संशोधन समय का मतलब है, तो मैं एक ही समस्या थी, और इसे exiftool के साथ पुनर्प्राप्त करने में सक्षम था ।
exiftool -tagsFromFile input.mp4 -extractEmbedded -all:all -FileModifyDate -overwrite_original output.mp4
यह मेटाडाटा और FileModifyDate
से लेता है input.mp4
और इसे कॉपी करता है output.mp4
।
इसे स्वचालित करने के लिए क्योंकि मेरे पास बड़ी संख्या में फ़ाइलें ट्रांसकोड करने के लिए थीं, मैंने श्रिंकव्रप नामक एक टूल बनाया, जो पहले FFmpeg के साथ ट्रांसकोड करता है (मैं अधिक मेटाडेटा को संरक्षित करने की आवश्यकता के कारण हैंडब्रेक से दूर चला गया), फिर एक्सफ़िल्टुल के साथ संशोधन टाइमस्टैम्प को पुनः प्राप्त करता है।
बहुत खोज के बाद, मैंने ज्यादातर अपने नए हैंडब्रेक-कम्प्रेस्ड वीडियो फ़ाइलों के बनाए / संशोधित किए गए दिनांक को अधिलेखित करने के लिए बनाए / संशोधित किए गए सही तिथि के साथ पुरानी वीडियो फ़ाइलों का उपयोग करने पर छोड़ दिया। चूंकि मेरे अधिकांश वीडियो में फ़ाइल नाम में तारीख / समय होता है, इसलिए मैंने प्रयोग किया और काम करने के दो तरीके मिले। पहला और सबसे अच्छा उन्नत रेनमर की टाइमस्टैम्प विधि का उपयोग करना है, जो न केवल फ़ाइल नाम को संशोधित, निर्मित और एक्सेस की गई फ़ाइल की तारीख को बदल सकता है। https://www.advancedrenamer.com/download ।
मुझे एक पॉवरशेल स्क्रिप्ट भी मिली। https://www.michaelmiklis.de/set-creation-and-modification-date-from-filename/ जिसे प्रोग्रामर द्वारा अन्य फ़ाइल नाम / तिथि प्रारूपों के लिए अनुकूलित किया जा सकता है। अपनी वर्तमान स्थिति में यह केवल तभी काम करता है जब फ़ाइल नाम की संरचना ठीक वैसी ही हो जैसी कि उस उदाहरण में है।
सौभाग्य से फ़ाइल नाम में संशोधित तारीख के बिना मेरे वीडियो की संख्या काफी कम है मैं उन्हें मैन्युअल रूप से बदल सकता हूं, बहुत लंबा नहीं लगेगा।
मैंने ffmpeg का उपयोग करने की कोशिश की, लेकिन इसका map_metadata कमांड केवल फ़ाइल के अंदर डेटा को बदलता है, न कि संशोधित तिथि, फ़ाइल से बना। इस तरह का आंतरिक मेटाडेटा हैंडब्रेक पहले से ही किसी भी तरह से ठीक करता है।
प्रोग्राम MyFFmpeg यह बहुत अच्छी तरह से करता है। इसके विकल्पों में सोर्स फाइल से ओरिजिनल क्रिएशन / मोडिफाइड डेट रखने का विकल्प है ।
मैं इसकी तलाश में था क्योंकि मेरे पास Plex सर्वर पर मेरे घर के वीडियो हैं और फाइलें निर्माण तिथि द्वारा आयोजित की जाती हैं, जो कि यदि आप किसी विशेष वर्ष से सामान देखना चाहते हैं तो बहुत उपयोगी है।
दुर्भाग्य से यह एक मुफ्त विकल्प नहीं है, वर्तमान में इसकी लागत 20 यूरो या लगभग 21 यूएस है। आपके पास लाइसेंस खरीदने से पहले 10 उपयोगों के लिए एक परीक्षण है। आश्चर्यचकित कुछ मुक्त ffmpeg GUIs के पास यह विकल्प नहीं है या नहीं है।
जब मैं अपने अविश्वसनीय रूप से बड़े GoPro MP4 वीडियो को H.264 में संकुचित करता हूं, तो मैं निर्माण तिथि को बनाए रखने की कोशिश करता हूं।
मुझे प्रोग्राम हैंडब्रेकबैच मिला । सृजन की तारीख (मेटाडेटा) को ध्यान में रखते हुए, एक ही बार में 1000 से अधिक फ़ाइलों को संपीड़ित करने की आवश्यकता है।
कोई अन्य कार्यक्रम नहीं मिला है जो ऐसा करने में सक्षम हैं। FFmpeg, हैंडब्रेक और अद्भुत वीडियो कनवर्टर के साथ प्रयास किया, लेकिन नहीं।