Giống như @dstob đã đề cập, bạn có thể sử dụng ffprobe
để lấy I-frames và thông tin liên quan của chúng. ffprobe
đi kèm với một số bản dựng tĩnh trên trang tải xuống và cũng có thể được xây dựng từ nguồn.
Điều này giả sử bạn đang dùng Linux / Unix:
Trích xuất khung và loại khung
ffprobe -select_streams v -show_frames \
-show_entries frame=pict_type \
-of csv bbb480.avi \
| grep -n I | cut -d ':' -f 1
Các grep
lệnh lọc dòng với I
trong họ, và đếm chỉ mục của họ (bằng cách sử dụng -n
tùy chọn). Các cut
lệnh chọn cột đầu tiên của kết quả duy nhất (chỉ số). Lưu ý rằng chỉ số này là dựa trên 1, không dựa trên 0.
Đổi tên tập tin đầu ra dựa trên chỉ mục
Bạn thực sự có thể dẫn các chỉ số này vào một danh sách:
ffprobe -select_streams v -show_frames \
-show_entries frame=pict_type \
-of csv bbb480.avi \
| grep -n I | cut -d ':' -f 1 > frame_indices.txt
Sau đó, tạo một danh sách tất cả các hình thu nhỏ quá:
ls -1 thumbnails*.jpeg > thumbnails.txt
Sau đó dán hai cái đó lại với nhau:
paste thumbnails.txt frame_indices.txt > combined.txt
Danh sách hiện chứa tên của hình thu nhỏ và chỉ mục. Thực hiện đổi tên dựa trên đó:
while read -r thumbnail index; do
newIndex=$(echo $index - 1 | bc) # subtract 1 from the index
mv -- "$thumbnail" "thumbnail-$newIndex.jpeg" # rename file
done < combined.txt
Ở trên sẽ đổi tên thumbnail-01.jpeg
thành thumbnail-0.jpeg
. Lưu ý rằng không có phần đệm bằng 0 trên chỉ mục đầu ra. Nếu bạn muốn không đệm nó, giả sử, 5 chữ số, sử dụng printf
:
newIndex=$(printf '%05d' $(echo $index - 1 | bc))
Trên Windows, bạn sẽ làm tương tự với ffprobe
nhưng phân tích đầu ra khác nhau. Không có ý tưởng làm thế nào để thực hiện việc đổi tên ở đó mặc dù.