Hình ảnh được tự động trích xuất từ video

Tự động trích xuất hàng loạt khung hình từ video

Trong bài này, anh Lựợm chia sẻ cách tự động trích xuất hàng loạt khung hình từ video để tiện cho việc tra cứu trên Google Drive.

Nhu cầu lưu trữ và tra cứu

Anh dùng GoPro để ghi lại lộ trình của mình. Nếu dùng định dạng 4k60 thì cỡ 8,5 phút là hết 4GB, mỗi ngày di chuyển 40 phút thì mất cỡ 20GB. Quá khủng khiếp! Trong khi đó đống dữ liệu này cơ bản là vô giá trị. Nếu giữ lại thì quá tốn kém, mà bỏ đi thì biết đâu có lúc cần dùng đến như này:

Xe căng hải nghiêm chỉnh chấp hành luật lệ giao thông. Hà Nội, 4/2021.

Giải pháp tiết kiệm nhất hiện thời là tống lên Google Drive, khi nào cần thì kéo về. Đằng nào thì cũng mất tiền mua gói không giới hạn rồi. Nhưng để biết cái video nào có thứ mình cần mà lại xem từng cái thì cũng không khả thi.

Hay là cứ mỗi khoảng thời gian nào đó thì mình chụp lại một khung hình (frame) để tiện theo dõi. Tất nhiên là phải làm tự động.

Dùng ffmpeg và một chút bash

Hoá ra cũng không có gì phức tạp cả. Các anh hùng trên mạng bảo là dùng ffmpeg. Nếu dùng macOS thì phải cài đặt qua brew, còn Linux thì cài đặt thẳng luôn.

Cách dùng thế này:

ffmpeg -i video.mp4 -r 0.03 video-%04d.jpg

Tuỳ chọn -r n là số khung hình mỗi giây. Ở đây anh chọn 0.03, tức là cứ mỗi 33,33 giây thì lấy một khung hình. Nếu muốn mỗi phút lấy một hình thì n sẽ là 0.0167. Còn cái chuỗi %04d là số thứ tự theo định dạng 0001, 0002,… Nếu thích 3 số thì chuyển thành %03d.

Còn định dạng ảnh được lấy ra thì có thể là jpg, png, tiff hoặc bmp. Trong đó png thì chậm, dung lượng lớn; tiff thì nhanh, dung lượng rất lớn; còn jpg thì nhanh, dung lượng thấp, bị vỡ hình nhưng quan trọng gì, vì mình chỉ dùng để xem cho nhanh.

Bởi vì mỗi tập tin chỉ được tối đa 4GB nên nếu quay quá 8 phút rưỡi chẳng hạn thì sẽ có nhiều hơn một tập tin. Nên để tiết kiệm thời gian thì anh viết sẵn một dòng lệnh như này:

for i in `ls *.MP4`; do \
    n=`basename -s .MP4 $i`; \
    ffmpeg -i $i -r 0.03 $n-%04d.jpg; \
done

Quy trình thực hiện

Thế là mỗi lần quay xong, anh vào thư mục đã được cấu hình để đồng bộ với Google Drive, tạo một thư mục con theo định dạng YYYY-MM-DD – Event rồi chép video vào.

Tiếp theo, anh mở Terminal, cd vào thư mục đó, chạy lệnh ở trên.

Đồng bộ xong thì anh vào drive.google.com để di chuyển thư mục con kia sang vị trí khác (không đồng bộ với máy tính), thư mục tương ứng ở máy tính sẽ tự động được xoá đi và giải phóng ổ cứng.