bash脚本:测试视频文件失败

时间:2013-03-07 18:08:03

标签: bash

我已经编写了一个小的bash脚本来以批处理模式从视频文件中提取音频。

使用avconv(以及flac编解码器)将声音从每个mp4文件提取为flac格式。

#!/bin/sh
#
# Batch conversion of audio extraction from video

FOLDER_SRC="/home/Me/Music/TestBatchConv"

for myvid in $(find ${FOLDER_SRC} | grep mp4)
do
avconv -i $myvid -acodec flac "${myvid}.flac"
done

exit 0

它工作正常,但我想改进它。

如何测试文件是否为视频? 我试过像

这样的东西
for myvid in $(find ${FOLDER_SRC})
do
    if [ file -i $myvid | grep video ]
        then avconv -i $myvid -acodec flac "${myvid}.flac"
    fi
done

但我无法完成它(是的我是新手)。

任何帮助表示感谢。

3 个答案:

答案 0 :(得分:2)

我首先要创建一个文件列表

   find ${FOLDER_SRC} -type f -exec file \{\} +

只有file的一次调用,请参阅man find并查找“-exec command {} +”

为空格添加简单的解决方法

   find ${FOLDER_SRC} -type f -exec file \{\} + |tr ' ' '°'

简单而充足。 另一种方法是使用mapfile

遍历文件列表并在案例陈述中定义操作

   for line in $(find ${FOLDER_SRC} -type f -exec file \{\} + |tr ' ' '°')
   do
     file=${line%%:*}
     file=${file//°/ }          
     content=${line#*:}
     content=${content//°/ }          
     case "${content}" in
         *video/mp2p*) myConvertFunctionA;;
         *video/mpeg*) myConvertFunctionB;;
         *video*) echo "found unsupported video type: ${content}";;
     esac
   done
  • 通过bash内置的字符串操作很快
  • case很容易理解
  • 避免多次grep

答案 1 :(得分:1)

将您的新测试重写为

 if  file -i $myvid | grep -q video  ; then

-q选项表示安静,因此如果grep找到搜索目标,则返回true,如果没有,则返回falseif会根据返回的truefalse状态做出相应的响应。

if语句一起使用的大括号实际上是test cmd的别名,所以类似

  if [ $(file -i $myvid | grep video) = "video" ] ; then

也可以。

要学习如何正确处理这类事情,只需在命令行上工作,并一次添加一位,即

 file -i $myvid 

然后

file -i $myvid | grep video

OR

file -i $myvid | grep -q video ; echo $?

要看到反向,请改为

file -i $myvid | grep nonesuch ; echo $?

修改

要测试不止一件事,你可以使用egrep,即

 if  file -i $myvid | egrep -q 'video|application/octet'  ; then

IHTH

答案 2 :(得分:0)

使用'file'可以对付幻数,因此有时可能会出错。

我用'mplayer'来获取数据:

mplayer -ao null -vo null -endpos 0.01 ${MEDIAFILE} 2>/dev/null | egrep "AUDIO:|VIDEO:"

这将提供音频和视频匹配。您可以省略其中一个或向egrep添加'-c',以便进行匹配:

if [ `mplayer -ao null -vo null -endpos 0.01 ${MEDIAFILE} | egrep -c "VIDEO:"` -gt 0 ]; then
    # HANDLE VIDEO FILE
fi

但是,由于您要从视频文件中提取音频,因此您可能希望确保要处理的视频文件也具有音频组件:

AVCHECK=`mplayer -ao null -vo null -endpos 0.01 ${MEDIAFILE} 2>/dev/null | egrep "AUDIO:|VIDEO:"`

if [ `echo "${AVCHECK}" | grep -c AUDIO` && `echo "${AVCHECK}" | grep -c VIDEO` ]; then
    # STRIP AUDIO FROM VIDEO FILE
fi