Câu trả lời:
ffmpeg
3.4.4 có thể thực hiện trực tiếp trên Ubuntu 18.04
Bạn có thể muốn sử dụng một cái gì đó như:
sudo apt-get install ffmpeg
wget -O opengl-rotating-triangle.mp4 https://github.com/cirosantilli/media/blob/master/opengl-rotating-triangle.mp4?raw=true
ulimit -Sv 1000000
ffmpeg \
-i opengl-rotating-triangle.mp4 \
-r 15 \
-vf scale=512:-1 \
-ss 00:00:03 -to 00:00:06 \
opengl-rotating-triangle.gif
Kiểm tra thủ tục tạo dữ liệu được mô tả trên bài đăng này .
Một cách trực tiếp hơn:
sudo apt-get install ffmpeg
ffmpeg -i in.mp4 out.gif
cũng hoạt động, nhưng GIF đầu ra sẽ lớn hơn video đầu vào, vì các định dạng video nén thông minh trên các khung.
Phân tích đối số:
ulimit -Sv 1000000
: đặt kích thước bộ nhớ tối đa 1Gb cho chương trình.
Chủ yếu là tôi đảm bảo rằng lệnh không sử dụng bộ nhớ không giới hạn như các lần thử trước.
500Mb khiến ffmpeg không tải được thư viện chia sẻ ... thời gian nâng cấp RAM của bạn?
-ss 00:00:03 -to 00:00:06
: thời gian bắt đầu và kết thúc để cắt video từ.
Không, GIF không phải là cách tốt nhất để cướp biển phân phối video trực tuyến.
-vf scale=512:-1
: tạo các 512
pixel đầu ra theo chiều cao và điều chỉnh độ rộng để duy trì tỷ lệ khung hình.
Đây là trường hợp sử dụng phổ biến cho hình ảnh cho web, có xu hướng có độ phân giải nhỏ hơn nhiều so với video.
Nếu bạn xóa tùy chọn này, GIF đầu ra có cùng chiều cao với video đầu vào.
Ví dụ ffprobe
: chiều cao của video gốc có thể được tìm thấy với : https://superuser.com/questions/595177/how-to-retrieve-video-file-inif-from-command-line-under-linux/1035178#1035178 và là 1024 x 1024 trong trường hợp của chúng tôi.
-r 15
: lấy mẫu FPS.
Ví dụ: video gốc là 30 FPS, vì vậy -r 15
có nghĩa là ffmpeg
sẽ chọn một khung hình trong mỗi 2 ( = 30 / 15
).
Tuy nhiên, FPS đầu ra cảm nhận được điều chỉnh để phù hợp với đầu vào, do đó bạn sẽ không nhận thấy tốc độ tăng, chỉ có độ chi tiết cao hơn.
Có thể tìm thấy FPS đầu vào ffprobe
và tổng số khung hình đầu vào có thể được mediainfo
giải thích tại: https://superuser.com/questions/84631/how-do-i-get-the-number-of-frames -in-a-video-on-the-linux-lệnh-line / 1044894 # 1044894
Tôi khuyên bạn nên tùy chọn này vì các định dạng video thường có tốc độ khung hình cao hơn do độ phân giải lớn hơn. Với các GIF nhỏ hơn, tốc độ khung hình thấp hơn ít được chú ý hơn và vì vậy chúng ta có thể bỏ qua một số khung và tạo các GIF nhỏ hơn.
Trước ngày 18.04: ffmpeg
+ convert
một lớp không có tệp trung gian
ffmpeg
không thể xử lý GIF trước đây. Điều tốt nhất tôi có là một cái gì đó cùng:
sudo apt-get install ffmpeg imagemagick
ffmpeg -i input.mp4 -r 10 -f image2pipe -vcodec ppm - | \
convert -delay 5 -loop 0 - output.gif
Giải thích một số lập luận:
-loop 0
: thêm trường đếm mở rộng Netscape Gif vào đầu ra. 0 có nghĩa là vòng lặp vô hạn như mô tả tại địa chỉ: http://www.vurdalakov.net/misc/gif/netscape-looping-application-extension eog
, firefox
và crom tất cả các vòng lặp vô hạn theo mặc định ngay cả khi không nó, vì vậy tôi không chắc chắn như thế nào cần thiết nó là nữa
-delay 5
: thời gian chờ đợi trước khi hiển thị khung tiếp theo, tính bằng hundreths của giây, như được mô tả tại: https://en.wikipedia.org/wiki/GIF#Animated_GIF byte 324. Có 100
nghĩa là 1 FPS, 5
có nghĩa là 1 / 0.5 == 20FPS
.
Ngay cả khi bạn giảm chiều cao và tốc độ khung hình, GIF đầu ra vẫn có thể lớn hơn video, vì các định dạng video không phải là GIF "thực" nén trên các khung, trong khi GIF chỉ nén từng khung hình.
Một trực tiếp:
convert input.mp4 rpi2-bare-metal-blink.gif
đã hoạt động, nhưng gần như đã giết chết máy tính của tôi vì tràn bộ nhớ và tạo ra một ouptput lớn hơn 100 lần cho tệp đầu vào 2Mb của tôi. Có thể một ngày nào đó ImageMagick sẽ bắt kịp.
Đã thử nghiệm trên Ubuntu 17.10.
scale=320:-1
-r 10
sẽ đưa GIF trở lại tốc độ bình thường.
Hai bước:
Trích xuất hình ảnh từ video
Tạo một thư mục được gọi là khung trong cùng thư mục với .mp4
tệp của bạn . Sử dụng lệnh:
ffmpeg -i video.mp4 -r 5 'frames/frame-%03d.jpg'
-r 5 stands for FPS value
for better quality choose bigger number
adjust the value with the -delay in 2nd step
to keep the same animation speed
%03d gives sequential filename number in decimal form
cd frames
convert -delay 20 -loop 0 *.jpg myimage.gif
-delay 20 means the time between each frame is 0.2 seconds
which match 5 fps above.
When choosing this value
1 = 100 fps
2 = 50 fps
4 = 25 fps
5 = 20 fps
10 = 10 fps
20 = 5 fps
25 = 4 fps
50 = 2 fps
100 = 1 fps
in general 100/delay = fps
-loop 0 means repeat forever
Tài liệu: chuyển đổi tùy chọn gif
Bạn sẽ kết thúc với một tệp khá lớn, hãy xem hướng dẫn ảo thuật hình ảnh để tối ưu hóa gif trên các tùy chọn bạn có thể thêm vào lệnh bước thứ hai để có được một tệp nhỏ hơn.
frames
thư mục phải tồn tại để lệnh đầu tiên hoạt động.
-layers Optimize
vào convert
lệnh cuối cùng trước đó *.jpg
. Kiểm tra đầu ra mặc dù, nó có thể bị ảnh hưởng. Đối với tôi, nó đã giảm kích thước gif từ 5 MB xuống 700 KB mà không giảm chất lượng
ffmpeg -i video.mp4 -r 5 'frames/frame-%03d.png'
.
gifify là một tiện ích dựa trên nút tất cả trong một giúp đơn giản hóa việc chuyển đổi. Nó phụ thuộc vào nodejs
, npm
, ffmpeg
, và imagemagick
đó là tất cả có sẵn trong Repos.
Khi bạn đã npm
cài đặt, bạn có thể cài đặt gifify
trên toàn cầu với:
npm install -g gifify
Một video có thể được chuyển đổi thành .GIF với:
gifify video.mp4 -o video.gif
Bạn cũng có thể tùy ý đặt vị trí bắt đầu và kết thúc trong video và thêm chú thích văn bản:
gifify clip.mp4 -o clip.gif --from 01:48:23.200 --to 01:48:25.300 --text 'we are the knights who say nip!'
Có thể mất vài phút để chuyển đổi hoàn thành ngay cả với các video nhỏ hơn.
LƯU Ý:
ffmpeg
vàimagemagick
có thể cần được biên dịch với một số thư viện cụ thể (ví dụ libass và fontconfig tương ứng).
gifsicle
, nhưng sau đó, một vấn đề khác xảy ra: github.com/vvo/gifify/issues/95 Ngoài ra, bạn có phiền khi cho chúng tôi biết những người mới npm trong thư mục nào để chạy npm install
và có nên chạy nó dưới quyền root hay không? Cảm ơn!