नमस्ते मुझे ffmpeg का उपयोग करके वीडियो से फ़्रेम निकालने की आवश्यकता है .. क्या इससे अधिक तेज़ तरीका है:
ffmpeg -i file.mpg -r 1/1 $filename%03d.jpg
?
parallel -i {} -r 1/1 {.}-%03d.bmp ::: *mpg
नमस्ते मुझे ffmpeg का उपयोग करके वीडियो से फ़्रेम निकालने की आवश्यकता है .. क्या इससे अधिक तेज़ तरीका है:
ffmpeg -i file.mpg -r 1/1 $filename%03d.jpg
?
parallel -i {} -r 1/1 {.}-%03d.bmp ::: *mpg
जवाबों:
यदि JPEG एन्कोडिंग चरण बहुत अधिक प्रदर्शन गहन है, तो आप हमेशा BMP छवियों के रूप में असम्पीडित स्टोर कर सकते हैं:
ffmpeg -i file.mpg -r 1/1 $filename%03d.bmp
यह भी JPEG के लिए transcoding द्वारा मात्रा का ठहराव के माध्यम से अधिक गुणवत्ता नुकसान नहीं होने का लाभ है। (पीएनजी भी दोषरहित है लेकिन जेपीईजी की तुलना में इसे सांकेतिक शब्दों में बदलने में अधिक समय लगता है।)
ffmpeg -r 1 file.mp4 -r 1 "$filename%03d.png"
ffmpeg -r 1 -i file.mp4 -r 1 "$filename%03d.png
, है ना? (आप याद आ रहे थे -i
)
इस सवाल पर आया था, इसलिए यहाँ एक त्वरित तुलना है। 38m07s वीडियो से प्रति मिनट एक फ्रेम निकालने के लिए इन दो अलग-अलग तरीकों की तुलना करें:
time ffmpeg -i input.mp4 -filter:v fps=fps=1/60 ffmpeg_%0d.bmp
1m36.029s
यह लंबा समय लगता है क्योंकि वांछित फ्रेम पाने के लिए ffmpeg संपूर्ण वीडियो फ़ाइल को पार्स करता है।
time for i in {0..39} ; do ffmpeg -accurate_seek -ss `echo $i*60.0 | bc` -i input.mp4 -frames:v 1 period_down_$i.bmp ; done
0m4.689s
यह लगभग 20 गुना तेज है। हम वांछित समय इंडेक्स पर जाने और एक फ्रेम निकालने के लिए तेजी से उपयोग करते हैं, फिर हर बार इंडेक्स के लिए कई बार ffmpeg को कॉल करते हैं। ध्यान दें कि -accurate_seek
डिफ़ॉल्ट है
, और सुनिश्चित करें कि आप -ss
इनपुट वीडियो -i
विकल्प से पहले जोड़ते हैं ।
ध्यान दें कि इसका उपयोग -filter:v -fps=fps=...
करना बेहतर है -r
क्योंकि बाद में गलत हो सकता है। यद्यपि टिकट को निर्धारित के रूप में चिह्नित किया गया है , फिर भी मैंने कुछ मुद्दों का अनुभव किया, इसलिए इसे सुरक्षित रूप से खेलना बेहतर है।
bc
एक देशी उबंटू पैकेज नहीं है, बजाय एक पार्टी का उपयोग कर सकते हैं: let "i = $i * 60"
। BTW - उत्कृष्ट विचार
-ss
पहले जोड़ अच्छा टिप -i
। अन्यथा, पूरे वीडियो को डिकोड किया जाएगा और बिना फ़्रेम वाले फ्रेम को छोड़ दिया जाएगा
ffmpeg
आपके मेजबान के एक प्रति कोर के लिए चल रहा है - जो (bmp के लिए) गति में निकट-रैखिक सुधार प्राप्त करता है (जब तक कि आप किसी अन्य अड़चन को नहीं मारते, जैसे कि डिस्क)।
यदि आप वास्तव में जानते हैं कि कौन से फ्रेम को निकालना है, उदाहरण के लिए 1, 200, 400, 600, 800, 1000, तो प्रयोग करके देखें:
select='eq(n\,1)+eq(n\,200)+eq(n\,400)+eq(n\,600)+eq(n\,800)+eq(n\,1000)' \
-vsync vfr -q:v 2
मैं किसी भी वीडियो से 10 फ्रेम पूर्वावलोकन पाने के लिए Imagemagick के असेंबल के लिए एक पाइप के साथ इसका उपयोग कर रहा हूं। जाहिर है कि फ्रेम संख्या का उपयोग करके आपको यह पता लगाना होगाffprobe
ffmpeg -i myVideo.mov -vf \
select='eq(n\,1)+eq(n\,200)+eq(n\,400)+eq(n\,600)+eq(n\,800)+eq(n\,1000)',scale=320:-1 \
-vsync vfr -q:v 2 -f image2pipe -vcodec ppm - \
| montage -tile x1 -geometry "1x1+0+0<" -quality 100 -frame 1 - output.png
।
थोड़ा स्पष्टीकरण:
+
OR और *
AND के लिए हैं\,
बस ,
चरित्र से बच रहा है-vsync vfr -q:v 2
काम नहीं लगता, लेकिन मुझे नहीं पता कि क्यों - कोई भी?मैं इसे करने की कोशिश की। 32 सेकंड में 3600 फ्रेम। आपकी विधि वास्तव में धीमी है। आपको यह कोशिश करनी चाहिए।
ffmpeg -i file.mpg -s 240x135 -vf fps=1 %d.jpg
ffmpeg -i "input URL" -vf fps=1/5 out%d.png
कि इनपुट URL का https लिंक कहां है।
ffmpeg -i file.mpg -vf fps=1 %d.jpg
मेरे मामले में मुझे हर सेकंड कम से कम फ्रेम की जरूरत है। मैंने उपर्युक्त दृष्टिकोण के लिए 'तलाश' का इस्तेमाल किया, लेकिन सोचा कि क्या मैं कार्य को समानांतर कर सकता हूं। मैंने यहाँ FIFO दृष्टिकोण के साथ एन प्रक्रियाओं का उपयोग किया: /unix/103920/parallelize-a-bash-for-loop/216475#216475
open_sem(){
mkfifo /tmp/pipe-$$
exec 3<>/tmp/pipe-$$
rm /tmp/pipe-$$
local i=$1
for((;i>0;i--)); do
printf %s 000 >&3
done
}
run_with_lock(){
local x
read -u 3 -n 3 x && ((0==x)) || exit $x
(
"$@"
printf '%.3d' $? >&3
)&
}
N=16
open_sem $N
time for i in {0..39} ; do run_with_lock ffmpeg -ss `echo $i` -i /tmp/input/GOPR1456.MP4 -frames:v 1 /tmp/output/period_down_$i.jpg & done
अनिवार्य रूप से मैंने प्रक्रिया को फोर्क किया और साथ ही समवर्ती धागों की संख्या को N तक सीमित कर दिया।
इसने मेरे मामले में 26 सेकंड से 16 सेकंड तक 'तलाश' को बेहतर बनाया। एकमात्र समस्या मुख्य धागा है जो सफाई से टर्मिनल से बाहर नहीं निकलता है क्योंकि स्टडआउट बाढ़ हो जाता है।
इसने मेरे लिए काम किया
ffmpeg -i file.mp4 -vf fps=1 %d.jpg