教你在Linux中從視頻流截取圖片幀(ffmpeg)
Linux依賴說(shuō)明:
說(shuō)明: 使用到的 依賴包 1. ffmpeg sudo apt update sudo apt-get install ffmpeg 2. imagemagick (選裝) (檢測(cè)圖像邊緣信息推斷清晰度,如果是簡(jiǎn)單截取但個(gè)圖像幀=>用不到<=) sudo apt-get install imagemagick 備注: 指令及相關(guān)參數(shù)說(shuō)明
核心指令: (作用: 執(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
指令說(shuō)明:
這條
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)前幀的編號(hào),
mod(n,10)計(jì)算幀編號(hào)除以 10 的余數(shù),
not(mod(n,10))選擇那些編號(hào)是 10 的倍數(shù)的幀。
- 換句話說(shuō),這條命令每 10 幀提取一個(gè)幀。
3. -frames:v 5
- 只提取 5 幀圖片。
4. -q:v 1
-q:v設(shè)置視頻幀的質(zhì)量,范圍為 1 到 31,值越小質(zhì)量越高,1是最高質(zhì)量。
5. output_%03d.jpg
- 輸出文件名模板。
%03d是一個(gè)占位符,表示文件名中包含 3 位數(shù)字(例如output_001.jpg,output_002.jpg),這樣可以保存多個(gè)幀。
整體含義:
從視頻中每隔 10 幀提取一個(gè)幀,總共提取 5 幀,保存為高質(zhì)量的 JPEG 圖片文件,文件名為
output_001.jpg,output_002.jpg, 以此類推。
指令執(zhí)行完可見(jiàn)當(dāng)前文件夾中文件:

具體的命令可根據(jù)需求情況進(jìn)行修改, 到這里文章的標(biāo)題功能就已經(jīng)實(shí)現(xiàn)了.
下面是加餐環(huán)節(jié)
需求: 提取視頻中的圖片幀, 并從多張中選取最清晰的一張照片
注: 其中的文件路徑需要改為自己所存在的路徑
這里準(zhǔn)備了三個(gè)腳本文件如下:
extract_frames.sh提取視頻幀輸出指定張數(shù)據(jù)照片并存到指定位置 并執(zhí)行detect_sharpness.sh腳本(已注釋掉, 需要的話自行打開(kāi))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í)行檢測(cè)圖片清晰度的腳本
# 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ì)算圖片的邊緣檢測(cè)值
edge_value=$(convert "$img" -edge 1 -format "%[mean]" info:)
echo "$img 邊緣檢測(cè)值: $edge_value"
# 比較邊緣值,保留最大值對(duì)應(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ù)源是一個(gè)靜態(tài)視頻, 當(dāng)然如果采集幀率過(guò)快時(shí)也會(huì)出現(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
shell 生成隨機(jī)數(shù)的實(shí)現(xiàn)方法總結(jié)
這篇文章主要介紹了 shell 生成隨機(jī)數(shù)的實(shí)現(xiàn)方法總結(jié)的相關(guān)資料,希望通過(guò)本能幫助到大家,讓大家徹底掌握這幾種隨機(jī)數(shù)的方法,需要的朋友可以參考下2017-09-09
linux腳本實(shí)現(xiàn)自動(dòng)發(fā)送和收取郵件的設(shè)置方法
這篇文章主要是介紹linux下通過(guò)腳本自動(dòng)發(fā)送和收取郵件的設(shè)置方法,有需要的朋友可以參考下2013-05-05
Linux中自定義shell腳本啟動(dòng)jar包的方法
這篇文章主要介紹了Linux中自定義shell腳本啟動(dòng)jar包的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
shell高級(jí)學(xué)習(xí)之正則表達(dá)式
這篇文章主要給大家介紹了關(guān)于shell高級(jí)學(xué)習(xí)之正則表達(dá)式的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用shell具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
shell腳本for循環(huán)實(shí)現(xiàn)文件和目錄遍歷
本文主要介紹了shell腳本for循環(huán)實(shí)現(xiàn)文件和目錄遍歷,首先進(jìn)行一個(gè)要遍歷的文件夾,然后循環(huán)查看每個(gè)文件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
Linux命令學(xué)習(xí)之原來(lái)最簡(jiǎn)單的ls命令這么復(fù)雜
ls命令應(yīng)該是我們最常用的命令之一了,但是我們可能容易忽略那些看起來(lái)最簡(jiǎn)單的東西。本文就來(lái)和大家詳細(xì)聊聊ls命令的使用,需要的可以了解一下2022-10-10
在Linux?中使用?pidstat?命令監(jiān)控進(jìn)程性能?的操作方法
pidstat是Linux系統(tǒng)中一個(gè)用于監(jiān)控各種統(tǒng)計(jì)信息的命令行工具,它能夠幫助用戶了解系統(tǒng)中各個(gè)進(jìn)程的資源使用情況,如CPU、內(nèi)存、I/O等,本文介紹了如何安裝pidstat,以及如何使用其不同的選項(xiàng)來(lái)監(jiān)控進(jìn)程的各種性能指標(biāo),感興趣的朋友一起看看吧2024-09-09
bash提取字符串${string:position:length}的具體使用
本文主要介紹了bash提取字符串${string:position:length}的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06

