教你在Linux中從視頻流截取圖片幀(ffmpeg)
Linux依賴說明:
說明: 使用到的 依賴包 1. ffmpeg sudo apt update sudo apt-get install ffmpeg 2. imagemagick (選裝) (檢測圖像邊緣信息推斷清晰度,如果是簡單截取但個圖像幀=>用不到<=) sudo apt-get install imagemagick 備注: 指令及相關參數說明
核心指令: (作用: 執(zhí)行 ffmpeg 命令提取幀,每10幀選擇一幀, 一共提取5張)
示例:
ffmpeg -i “https://cdn.pixabay.com/video/2023/10/22/186115-877653483_large.mp4” -vf “select=‘not(mod(n,10))’” -frames:v 5 -q:v 1 output_%03d.jpg
指令說明:
這條
ffmpeg命令從視頻流中提取幀并保存為圖片,具體的參數含義如下:
1. ffmpeg -i "https://cdn.pixabay.com/video/2023/10/22/186115-877653483_large.mp4"
ffmpeg:調用ffmpeg命令。-i "https://cdn.pixabay.com/video/2023/10/22/186115-877653483_large.mp4":指定輸入文件,視頻源為給定的網絡視頻 URL。
2. -vf "select='not(mod(n,10))'"
-vf:表示使用視頻濾鏡。 "select='not(mod(n,10))'":視頻幀選擇器,這里
mod(n,10)表示每 10 幀提取一次幀。
n是當前幀的編號,
mod(n,10)計算幀編號除以 10 的余數,
not(mod(n,10))選擇那些編號是 10 的倍數的幀。
- 換句話說,這條命令每 10 幀提取一個幀。
3. -frames:v 5
- 只提取 5 幀圖片。
4. -q:v 1
-q:v設置視頻幀的質量,范圍為 1 到 31,值越小質量越高,1是最高質量。
5. output_%03d.jpg
- 輸出文件名模板。
%03d是一個占位符,表示文件名中包含 3 位數字(例如output_001.jpg,output_002.jpg),這樣可以保存多個幀。
整體含義:
從視頻中每隔 10 幀提取一個幀,總共提取 5 幀,保存為高質量的 JPEG 圖片文件,文件名為
output_001.jpg,output_002.jpg, 以此類推。
指令執(zhí)行完可見當前文件夾中文件:

具體的命令可根據需求情況進行修改, 到這里文章的標題功能就已經實現(xiàn)了.
下面是加餐環(huán)節(jié)
需求: 提取視頻中的圖片幀, 并從多張中選取最清晰的一張照片
注: 其中的文件路徑需要改為自己所存在的路徑
這里準備了三個腳本文件如下:
extract_frames.sh提取視頻幀輸出指定張數據照片并存到指定位置 并執(zhí)行detect_sharpness.sh腳本(已注釋掉, 需要的話自行打開)detect_sharpness.sh從多張照片中選擇最清晰的一張 并將其余的照片刪除, 且保留最清晰一張并重命名create_directory.sh判斷文件夾是否存在, 不存在則創(chuàng)建, 存在則不處理
extract_frames.sh
提取視頻幀輸出指定張數據照片并存到指定位置 并執(zhí)行
detect_sharpness.sh腳本注: 執(zhí)行該腳本需要指定—視頻路徑
示例:
/data/hikuser/handler_video_to_picture/extract_frames.sh https://cdn.pixabay.com/video/2023/10/22/186115-877653483_large.mp4
#!/bin/bash
# 刪除指定目錄下已有的圖片
rm -f /data/hikuser/handler_video_to_picture/output*.jpg
# 檢查是否提供了視頻流 URL 參數
if [ "$#" -ne 1 ]; then
echo "Usage: ${0##*/} <video_stream_url>"
exit 1
fi
# 視頻流 URL
VIDEO_URL="$1"
# 檢查輸出目錄是否存在
if [ ! -d "/data/hikuser/handler_video_to_picture" ]; then
echo "Directory /data/hikuser/handler_video_to_picture does not exist."
exit 1
fi
# 執(zhí)行 ffmpeg 命令提取幀,每10幀選擇一幀, 一共提取5張
if ! ffmpeg -i "$VIDEO_URL" -vf "select='not(mod(n,10))'" -frames:v 5 -q:v 1 /data/hikuser/handler_video_to_picture/output_%03d.jpg; then
echo "ffmpeg command failed."
exit 1
fi
# 執(zhí)行檢測圖片清晰度的腳本
# if [ -f /data/hikuser/handler_video_to_picture/detect_sharpness.sh ]; then
# /bin/bash /data/hikuser/handler_video_to_picture/detect_sharpness.sh
# else
# echo "detect_sharpness.sh script not found!"
# exit 1
# fi
detect_sharpness.sh
從多張照片中選擇像素最高的一張 并將其余的照片刪除, 并將最新的一張重命名
#!/bin/bash
# 初始化最大邊緣值和最清晰的圖片變量
max_edge_value=0
sharpest_image=""
# 進入圖片所在目錄
cd /data/hikuser/handler_video_to_picture || exit 1
# 遍歷每張圖片并計算邊緣值
for img in output_*.jpg; do
# 計算圖片的邊緣檢測值
edge_value=$(convert "$img" -edge 1 -format "%[mean]" info:)
echo "$img 邊緣檢測值: $edge_value"
# 比較邊緣值,保留最大值對應的圖片
if (( $(echo "$edge_value > $max_edge_value" | bc -l) )); then
max_edge_value=$edge_value
sharpest_image=$img
fi
done
# 輸出最清晰的圖片
echo "最清晰的圖片是: $sharpest_image"
# 刪除其他圖片
for img in output_*.jpg; do
if [ "$img" != "$sharpest_image" ]; then
rm "$img"
fi
done
# 將最清晰的圖片重命名為 output.jpg
mv "$sharpest_image" /data/hikuser/handler_video_to_picture/output.jpg
echo "已刪除其他圖片,保留最清晰的圖片: $sharpest_image"
腳本執(zhí)行效果示例:

所以截取的圖片大小因為數據源是一個靜態(tài)視頻, 當然如果采集幀率過快時也會出現(xiàn)這樣的情況, 注意空值
create_directory.sh
判斷文件夾是否存在存在則創(chuàng)建不存在則不處理
#!/bin/bash
# 檢查是否提供了文件夾名稱參數
if [ "$#" -ne 1 ]; then
echo "Usage: ${0##*/} <directory_name>"
exit 1
fi
# 文件夾名稱
DIR_NAME="$1"
# 檢查文件夾是否存在
if [ -d "$DIR_NAME" ]; then
echo "Directory '$DIR_NAME' already exists."
else
# 創(chuàng)建文件夾
mkdir -p "$DIR_NAME"
if [ $? -eq 0 ]; then
echo "Directory '$DIR_NAME' has been created."
else
echo "Failed to create directory '$DIR_NAME'."
exit 1
fi
fi總結
到此這篇關于在Linux中從視頻流截取圖片幀(ffmpeg)的文章就介紹到這了,更多相關Linux從視頻流截取圖片幀內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
linux腳本實現(xiàn)自動發(fā)送和收取郵件的設置方法
這篇文章主要是介紹linux下通過腳本自動發(fā)送和收取郵件的設置方法,有需要的朋友可以參考下2013-05-05
shell腳本for循環(huán)實現(xiàn)文件和目錄遍歷
本文主要介紹了shell腳本for循環(huán)實現(xiàn)文件和目錄遍歷,首先進行一個要遍歷的文件夾,然后循環(huán)查看每個文件,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11
在Linux?中使用?pidstat?命令監(jiān)控進程性能?的操作方法
pidstat是Linux系統(tǒng)中一個用于監(jiān)控各種統(tǒng)計信息的命令行工具,它能夠幫助用戶了解系統(tǒng)中各個進程的資源使用情況,如CPU、內存、I/O等,本文介紹了如何安裝pidstat,以及如何使用其不同的選項來監(jiān)控進程的各種性能指標,感興趣的朋友一起看看吧2024-09-09
bash提取字符串${string:position:length}的具體使用
本文主要介紹了bash提取字符串${string:position:length}的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-06-06

