Debian LITE 流畅幻灯片放映

问题描述 投票:0回答:1

我有兴趣将我的

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
}
bash debian raspberry-pi3 slideshow raspbian
1个回答
0
投票

建议避免循环播放

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
© www.soinside.com 2019 - 2024. All rights reserved.