教你在Linux中從視頻流截取圖片幀(ffmpeg)
Linux依賴說明:
說明: 使用到的 依賴包 1. ffmpeg sudo apt update sudo apt-get install ffmpeg 2. imagemagick (選裝) (檢測圖像邊緣信息推斷清晰度,如果是簡單截取但個圖像幀=>用不到<=) sudo apt-get install imagemagick 備注: 指令及相關(guān)參數(shù)說明
核心指令: (作用: 執(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
命令從視頻流中提取幀并保存為圖片,具體的參數(shù)含義如下:
1. ffmpeg -i "https://cdn.pixabay.com/video/2023/10/22/186115-877653483_large.mp4"
ffmpeg
:調(diào)用ffmpeg
命令。-i "https://cdn.pixabay.com/video/2023/10/22/186115-877653483_large.mp4"
:指定輸入文件,視頻源為給定的網(wǎng)絡(luò)視頻 URL。
2. -vf "select='not(mod(n,10))'"
-vf
:表示使用視頻濾鏡。 "select='not(mod(n,10))'":視頻幀選擇器,這里
mod(n,10)表示每 10 幀提取一次幀。
n是當(dāng)前幀的編號,
mod(n,10)計(jì)算幀編號除以 10 的余數(shù),
not(mod(n,10))選擇那些編號是 10 的倍數(shù)的幀。
- 換句話說,這條命令每 10 幀提取一個幀。
3. -frames:v 5
- 只提取 5 幀圖片。
4. -q:v 1
-q:v
設(shè)置視頻幀的質(zhì)量,范圍為 1 到 31,值越小質(zhì)量越高,1
是最高質(zhì)量。
5. output_%03d.jpg
- 輸出文件名模板。
%03d
是一個占位符,表示文件名中包含 3 位數(shù)字(例如output_001.jpg
,output_002.jpg
),這樣可以保存多個幀。
整體含義:
從視頻中每隔 10 幀提取一個幀,總共提取 5 幀,保存為高質(zhì)量的 JPEG 圖片文件,文件名為
output_001.jpg
,output_002.jpg
, 以此類推。
指令執(zhí)行完可見當(dāng)前文件夾中文件:
具體的命令可根據(jù)需求情況進(jìn)行修改, 到這里文章的標(biāo)題功能就已經(jīng)實(shí)現(xiàn)了.
下面是加餐環(huán)節(jié)
需求: 提取視頻中的圖片幀, 并從多張中選取最清晰的一張照片
注: 其中的文件路徑需要改為自己所存在的路徑
這里準(zhǔn)備了三個腳本文件如下:
extract_frames.sh
提取視頻幀輸出指定張數(shù)據(jù)照片并存到指定位置 并執(zhí)行detect_sharpness.sh
腳本(已注釋掉, 需要的話自行打開)detect_sharpness.sh
從多張照片中選擇最清晰的一張 并將其余的照片刪除, 且保留最清晰一張并重命名create_directory.sh
判斷文件夾是否存在, 不存在則創(chuàng)建, 存在則不處理
extract_frames.sh
提取視頻幀輸出指定張數(shù)據(jù)照片并存到指定位置 并執(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 參數(shù) 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="" # 進(jìn)入圖片所在目錄 cd /data/hikuser/handler_video_to_picture || exit 1 # 遍歷每張圖片并計(jì)算邊緣值 for img in output_*.jpg; do # 計(jì)算圖片的邊緣檢測值 edge_value=$(convert "$img" -edge 1 -format "%[mean]" info:) echo "$img 邊緣檢測值: $edge_value" # 比較邊緣值,保留最大值對應(yīng)的圖片 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í)行效果示例:
所以截取的圖片大小因?yàn)閿?shù)據(jù)源是一個靜態(tài)視頻, 當(dāng)然如果采集幀率過快時也會出現(xiàn)這樣的情況, 注意空值
create_directory.sh
判斷文件夾是否存在存在則創(chuàng)建不存在則不處理
#!/bin/bash # 檢查是否提供了文件夾名稱參數(shù) 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
總結(jié)
到此這篇關(guān)于在Linux中從視頻流截取圖片幀(ffmpeg)的文章就介紹到這了,更多相關(guān)Linux從視頻流截取圖片幀內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
shell 生成隨機(jī)數(shù)的實(shí)現(xiàn)方法總結(jié)
這篇文章主要介紹了 shell 生成隨機(jī)數(shù)的實(shí)現(xiàn)方法總結(jié)的相關(guān)資料,希望通過本能幫助到大家,讓大家徹底掌握這幾種隨機(jī)數(shù)的方法,需要的朋友可以參考下2017-09-09linux腳本實(shí)現(xiàn)自動發(fā)送和收取郵件的設(shè)置方法
這篇文章主要是介紹linux下通過腳本自動發(fā)送和收取郵件的設(shè)置方法,有需要的朋友可以參考下2013-05-05shell腳本for循環(huán)實(shí)現(xiàn)文件和目錄遍歷
本文主要介紹了shell腳本for循環(huán)實(shí)現(xiàn)文件和目錄遍歷,首先進(jìn)行一個要遍歷的文件夾,然后循環(huán)查看每個文件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11Linux命令學(xué)習(xí)之原來最簡單的ls命令這么復(fù)雜
ls命令應(yīng)該是我們最常用的命令之一了,但是我們可能容易忽略那些看起來最簡單的東西。本文就來和大家詳細(xì)聊聊ls命令的使用,需要的可以了解一下2022-10-10在Linux?中使用?pidstat?命令監(jiān)控進(jìn)程性能?的操作方法
pidstat是Linux系統(tǒng)中一個用于監(jiān)控各種統(tǒng)計(jì)信息的命令行工具,它能夠幫助用戶了解系統(tǒng)中各個進(jìn)程的資源使用情況,如CPU、內(nèi)存、I/O等,本文介紹了如何安裝pidstat,以及如何使用其不同的選項(xiàng)來監(jiān)控進(jìn)程的各種性能指標(biāo),感興趣的朋友一起看看吧2024-09-09bash提取字符串${string:position:length}的具體使用
本文主要介紹了bash提取字符串${string:position:length}的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06