0

我编写了一个小 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

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

任何帮助表示赞赏。

4

3 回答 3

3

将您的新测试重写为

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

-q 选项表示安静,因此 greptrue如果找到搜索目标则返回,否则返回false。根据返回的or状态if适当地响应。truefalse

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

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

也可以。

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

 file -i $myvid 

然后

file -i $myvid | grep video

或者

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

于 2013-03-07T18:41:07.780 回答
2

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

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

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

为空间添加一个简单的解决方法

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

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

遍历文件列表并在 case 语句中定义操作

   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
于 2013-03-07T18:42:02.473 回答
1

使用“文件”对幻数起作用,所以有时它可能是错误的。

我使用“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
于 2013-03-07T20:19:40.037 回答