我有兴趣将我的
Raspberry Pi 3
用于广告目的。我想创建一个可以显示视频和图像的幻灯片,并且我希望能够迭代位于特定文件夹中的所有媒体文件,因为我对网络的控制有限并且需要从云源。
我目前有一个使用
fbi
和 vlc
来实现此目的的代码片段,但我面临一个问题,即每次图像转换后都会短暂出现命令行。视频后就没有这样的问题了
我已经设法通过明确的命令来缓解这个问题,但它仍然困扰着我。我想知道是否有人可以建议一种更顺利的方法来完成此任务,而无需命令行中断。
这里是我的代码:
#!/bin/bash
# Define the directory where your images are stored
MEDIA_FOLDER="/home/pi/slide_show/test"
# Create an array of media files
media_files=("$MEDIA_FOLDER"/*.{jpg,jpeg,png,gif,mp4})
clear
setterm -cursor off
# Iterate through media files and display them
while true; do
for media_file in "${media_files[@]}"; do
if [[ -f "$media_file" ]]; then
if [[ "$media_file" == *.mp4 ]]; then
vlc -f --one-instance --no-xlib -I dummy "$media_file" vlc://quit >/dev/null 2>&1
else
clear
fbi -a -b -u -noverbose -1 -t 5 "$media_file" >/dev/null 2>&1
clear
fi
fi
done
done
更新:
所以我现在至少有一个平滑的图像处理方式。在图像和视频之间切换时,仍有一小段时间黑屏。
DISPLAYTIME=10
MEDIA_FOLDER=""
# Function to kill display processes
killer() {
sudo pkill -9 -x "fbi"
sudo pkill -x "mpv"
sleep 2
}
# Function to display images and videos in terminal
display() {
local image_files="$1"
local video_files="$2"
killer
if [[ -n "$image_files" && -n "$video_files" ]]; then
while true; do
sudo fbi -a -r 5 -t $DISPLAYTIME -T 1 --noverbose -1 $image_files >/dev/null 2>&1 &
disown
sleep $((IMAGE_FILES_COUNT * DISPLAYTIME))
pkill -9 -x "fbi" >/dev/null 2>/dev/null &
mpv --fs --cache-secs=10 --fs-screen=1 "$video_files" >/dev/null 2>&1
clear
done
elif [ -n "$image_files" ]; then
clear
sudo fbi -a -r 5 -t $DISPLAYTIME -T 1 --noverbose $image_files >/dev/null 2>&1
elif [ -n "$video_files" ]; then
clear
mpv --fs --cache-secs=10 --loop=inf --fs-screen=1 "$video_files" >/dev/null 2>&1
fi
}
# Function to handle the main display logic
handle_display() {
local image_files=$(find "$MEDIA_FOLDER" -type f \( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" -o -iname "*.gif" \))
local video_files=$(find "$MEDIA_FOLDER" -type f \( -iname "*.mp4" -o -iname "*.mkv" -o -iname "*.avi" -o -iname "*.ogg" -o -iname "*.mov" \))
display "$image_files" "$video_files"
}
# Function to handle the main loop
main_loop() {
while true; do
sudo kill "$DISPLAYPID"
sleep 2
killer
if [ -d "$MEDIA_FOLDER" ] && [ "$(ls -A "$MEDIA_FOLDER")" ]; then
handle_display &
DISPLAYPID=$!
else
killer
clear
fi
sleep 10
done
}
建议避免循环播放
vlc
中的每个图像。
并使用
vlc
幻灯片显示整个目录 IMAGES_DIR
。
vlc -I dummy --dummy-quiet "${IMAGES_DIR}" --slide-show-delay 5
-I dummy
:-I
选项指定要使用的接口。 dummy
是 VLC 的界面之一。这是一个没有任何视觉元素的简约界面,当您想要使用 VLC 执行此类不需要完整图形界面的任务时,这非常有用。
--dummy-quiet
:此选项会抑制 dummy
接口不必要的输出。它使命令运行更加安静,无需使用来自 VLC 的消息填充您的终端或命令提示符。
IMAGES_DIR
:这是包含要显示的图像的目录的占位符。您应该将 IMAGES_DIR
替换为目录的实际路径。
--slide-show-delay 5
:此选项设置幻灯片中图像之间的延迟。 --slide-show-delay
后面的数字是延迟(以秒为单位)。在这种情况下,每张图像将显示 5 秒,然后再转到下一张。
如果您的文件夹包含非图片文件(音频、视频)。将图像文件复制到指定文件夹“IMAGES_DIR”。 因此你的脚本应该像这样简化:
#!/bin/bash
# Define the directory where your images are stored
MEDIA_FOLDER="/home/pi/slide_show/test"
# Create an array of media files
media_files=("$MEDIA_FOLDER"/*.{jpg,jpeg,png,gif,mp4})
clear
setterm -cursor off
# Iterate through media files and display them
while true; do
vlc -I dummy --dummy-quiet "${MEDIA_FOLDER}" --slide-show-delay 5
done