shell ffmpeg批处理问题

nom7f22z  于 2023-10-23  发布在  Shell
关注(0)|答案(1)|浏览(151)

我使用ffmpeg批处理目录中的所有文件(名称中包含空格)。脚本就像:

echo my converter
read -p "Enter give folder: " folder
echo '//////////////////////START CONVERTING FROM FOLDER///////////////////////'

find $folder -type f -name "*[[:space:]]*" | while read file; do
    release="${file%%.*}"'_t.mp4';
    echo "$file";
    ffmpeg -i "$file" -c copy "$release" -loglevel error -stats
    echo $release;
done

该脚本搜索地址和ffmpeg中的所有文件一个接一个。但是,由于一些未知的问题,第一个文件总是会失败:

[mpegts @ 0x7fb8e9904a40] Continuity check failed for pid 17 expected 2 got 3
[mpegts @ 0x7fb8e9904a40] Continuity check failed for pid 0 expected 0 got 2
[mpegts @ 0x7fb8e9904a40] Continuity check failed for pid 4096 expected 0 got 2
[mpegts @ 0x7fb8e9904a40] Continuity check failed for pid 256 expected 2 got 7
[mpegts @ 0x7fb8e9904a40] Packet corrupt (stream = 0, dts = 203523000).
/Users/xy/Downloads/aaa/aa vv.ts: corrupt input packet in stream 0
[NULL @ 0x7fb8e9905a40] Decoding VUI

如果只有一个文件,则该过程工作正常。如果注解掉ffmpeg命令,它会按预期回显:

/Users/xy/Downloads/aaa/aa vv_t.mp4
/Users/xy/Downloads/aaa/aa vv_t_t.mp4
/Users/xy/Downloads/aaa/aa vv.ts
/Users/xy/Downloads/aaa/aa vv_t.mp4
/Users/xy/Downloads/aaa/cc ee.ts
/Users/xy/Downloads/aaa/cc ee_t.mp4

它首先找到目标文件,然后转换成另一个不同的文件名。任何建议,谢谢!!

mrfwxfqh

mrfwxfqh1#

至少将您的代码更改为以下内容作为起点:

#!/usr/bin/env bash

echo 'my converter'
read -p 'Enter give folder: ' folder
echo '//////////////////////START CONVERTING FROM FOLDER///////////////////////'

while IFS= read -d '' -r file; do
    release="${file%%.*}_t.mp4"
    echo "$file"
    ffmpeg -nostdin -i "$file" -c copy "$release" -loglevel error -stats
    echo "$release"
done < <( find "$folder" -type f -name '*[[:space:]]*' -print0 )

正如您使用的bash标签所指示的那样-“对于有语法或其他错误的shell脚本,请在将它们发布到这里之前在http://shellcheck.net上检查它们。"我希望shellcheck已经警告过你我上面纠正的大多数问题。
有关我所做的ffmpeg更改的更多信息,请参见https://mywiki.wooledge.org/BashFAQ/089。参见https://mywiki.wooledge.org/BashFAQ/001https://mywiki.wooledge.org/Quotes
顺便说一下,“文件夹”是Windows术语,在Unix中它是一个“目录”。

相关问题