如何提取文本文件中列出的在线视频的持续时间



我需要检查数千个在线视频的持续时间。我正试图从一个包含视频网址的文本文件中获取这一信息。

我有两个命令可以很好地处理一个url,但我不知道如何处理文件文本中的列表。

fmpeg -i My.url 2>&1 | grep "Duration"| cut -d ' ' -f 4 | sed s/,//

或者这个:

ffmpeg -i my.url 2>&1 | grep Duration | sed 's/Duration: (.*), start/1/g'

我正在尝试:

fmpeg -i listurls.txt 2>&1 | grep "Duration"| cut -d ' ' -f 4 | sed s/,//

或者这个:

ffmpeg -i listurls.txt 2>&1 | grep Duration | sed 's/Duration: (.*), start/1/g'

我的文件文本如下:

myurl1.m3u8
myurl2.m3u8
myurl3.m3u8%br/>myurl4.m3u8.br/>my url5.m3u8

我也试过:

文件"myurl1.m3u8">
文件"myurl2.m3u8">
文件"myurl3.m3u8'">
file"myurl4.m3u'
file"myurl5.m3u8'

但它不起作用。

此外,一些视频可能不再在线,但仍被引用,因此不会给出结果,但如果可能的话,我希望有结果;0";总比什么都没有好,之后使用结果会容易得多。

(awk,sed,mediainfo,exiftool,任何都可以,(提前感谢。

mediainfo可以读取URL和本地文件,并可以选择以毫秒为单位输出持续时间。例如:

mediainfo --Inform='Video;%Duration%' video-path

一旦成功,它就会输出一个数字;一旦失败,它就不会。

请注意,要读取文件的持续时间,您可能需要下载整个文件。


外壳可以将毫秒转换为秒:

$ duration=91445
$ echo $((duration/1000))
91

方便的是,空变量被视为值为零:

$ duration=''
$ echo $((duration/1000))
0

请注意,shell处理整数(小数部分被丢弃(。


.m3u8文件是路径列表,中间穿插有注释(#...(。这可以过滤到仅路径:

grep -hv '^#' *.m3u8

可能有必要从DOS格式行中剥离r

... | tr -s `r` 'n'

应排除空行:

... | grep '[^[:space:]]'

xargs或一个简单的while循环可以组合所有这些:

grep -hv '^#' *.m3u8 |
grep '[^[:space:]]' |
tr -s 'r' 'n' |
while read -r path; do
duration=$(
mediainfo --Inform='Video;%Duration%' "$path" 2>&-
)
echo "$((duration/1000))  $path"
done

最新更新