视频/音频处理常用操作小脚本--我凌乱了

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
naturalaw
帖子: 1360
注册时间: 2011-09-06 22:04

视频/音频处理常用操作小脚本--我凌乱了

#1

帖子 naturalaw » 2011-11-07 2:40

这是半成品.
脚本功能:
1 视频转码

2 截取视频/音频

3 提取视频/音频

4 合并视频音频
这里有五个处理.
1 mp3+x264
2 get video clip(copy)
3 get audio(pcm)
4 get audio clip(pcm)
5 custom argument
处理5未完成

有些用法还是没搞懂,比如终端背景色和前景色的使用.处理5 没想好怎么搞.
命名似乎可以简化.请大大们赐教.多谢.
其实我更希望有人能写个图形前端出来 :em04 参数好难记,尽管有手册.

[bash]#!/bin/bash
# by @naturalaw

BG="\e[32;40m"
OUT=''
GET_TIME(){
echo "example:n secs or 0:1:12"
echo "from:"
read FROM
echo "to:"
read TO
}
if [ $# -ge 1 ];then
{
echo -e "###### mencoder convert######"
echo -e "code\toperation\n"
echo -e "1\tmp3+x264\n2\tget video clip(copy)\n3\tget audio(pcm)\n4\tget audio clip(pcm)\n5\tcustom argument\ninput code:"
read code
echo -e "${BG}please wait.working...\n"
case $code in
1)
mencoder "$1" -oac mp3lame -ovc x264 -o `echo -e "$1" | sed 's/...$/-x264.avi/'` 2>/dev/null
;;
2)
GET_TIME
OUT=`echo -e "$1" | sed 's/....$/-clip.avi/'`
mencoder -oac mp3lame -ovc copy -ss $FROM -endpos $TO "$1" -o $OUT 2>/dev/null
;;
3)
OUT=`echo -e "$1" | sed 's/....$/clip.wav/'`
mencoder "$1" -oac pcm -ovc frameno -o $OUT 2>/dev/null
;;
4)
GET_TIME
OUT=`echo -e "$1" | sed 's/....$/-clip.wav/'`
mencoder -oac pcm -ovc frameno -ss $FROM -endpos $TO "$1" -o $OUT 2>/dev/null
;;
5)
;;
*)
echo "wrong code."
;;
esac
}
else echo -e "Usage: convert foo"
fi
[/bash]
有修正.
[bash]#!/bin/bash
# by @naturalaw
# build 2011-11-06
# modified 2011-11-07
BG="\e[32;40m"
OUT=''
VIDEO="$1"
AUDIO="$2"
echo $VIDEO
GET_TIME(){
mediainfo "$VIDEO" | grep Duration | head -1
echo "example:n secs or 0:1:12"
echo "from:"
read FROM
echo "to:"
read TO
}
if [ $# -ge 1 ];then
{
echo -e "###### mencoder convert######"
echo -e "code\toperation\n"
echo -e "1\tmp3+x264\n2\tget video clip (copy)\n3\tget audio only (pcm)\n4\tget audio clip (pcm)\n5\tget video only (copy)\n6\tmerge audio and video\n7\ttcustom argument\ninput code:"
read code
# echo -e "${BG}please wait.working...\n"
case $code in
1)
OUT="${VIDEO/%.???/-x263.avi}"
mencoder "$VIDEO" -oac mp3lame -ovc x264 -o $OUT 2>/dev/null
;;
2)
GET_TIME
OUT="${VIDEO/%.???/-clip.avi}"
mencoder -oac mp3lame -ovc copy -ss $FROM -endpos $TO "$VIDEO" -o $OUT 2>/dev/null
;;
3)
OUT="${VIDEO/%.???/-clip.wav}"
mencoder "$VIDEO" -oac pcm -ovc frameno -o $OUT 2>/dev/null
;;
4)
GET_TIME
OUT="${VIDEO/%.???/-clip.wav}"
mencoder -oac pcm -ovc frameno -ss $FROM -endpos $TO "$VIDEO" -o $OUT 2>/dev/null
;;
5)
OUT="${VIDEO/%.???/-none-audio.avi}"
ffmpeg -i "$VIDEO" -an -vcodec copy $OUT
;;
6)
OUT="${VIDEO/%.???/-merge.avi}"
echo "How to deal with audio?(output audio codec)"
select OAC in "copy" "mp3lame";do
break
done
mencoder -audiofile "$AUDIO" "$VIDEO" -ovc copy -oac $OAC -mc 0 -noskip -o $OUT 2>/dev/null
;;
*)
echo "wrong code."
;;
esac
# echo -e "\n\nJob Done!\nPlay it?(y/n)"
# read ans
# [ $ans==y ] && mplayer $OUT
}
else echo -e "File "$VIDEO" Not Found.\nUsage: convert video [audio]"
fi
[/bash]
V3暂时不发了.还要修正一下.
上次由 naturalaw 在 2011-11-09 12:39,总共编辑 4 次。
  • The eternal law
头像
nmsfan
帖子: 18958
注册时间: 2009-10-16 22:46
来自: finland

Re: mencoder常用操作小脚本--我凌乱了

#2

帖子 nmsfan » 2011-11-07 9:11

wow~~~
mencoder参数感觉太复杂
我都ffmpeg的
好吧,我说的是视频
>>>>推Ubuntu 桌面培训~~<<<<
>>>>想加入/了解gimp汉化吗,点我吧~<<<<
——————————————————————
不推荐wubi,也不推荐你给别人推荐wubi…………
随心而为的感觉真好……
强推mayhem!!
强推ensiferum
头像
naturalaw
帖子: 1360
注册时间: 2011-09-06 22:04

Re: 视频/音频处理常用操作小脚本--我凌乱了

#3

帖子 naturalaw » 2011-11-08 23:30

mencoder的参数确实有些复杂.我现在是两个都用.反正能完成操作就行了.
第三个版本.不知不觉就有90+行代码了.


[bash]#!/bin/bash
# by @naturalaw
# build 2011-11-06 v1
# modified 2011-11-07 v2
# modified 2011-11-08 v3
BG="\e[32;40m"
OUT=''
VIDEO="$1"
AUDIO="$2"
INFO1=`ffmpeg -i "$VIDEO" 2>&1 | grep -P '(Duration|Stream)' | grep -v Data`
INFO2=`ffmpeg -i "$AUDIO" 2>&1 | grep -P '(Duration|Stream)' | grep -v Data`
[ -d ~/convert ] || mkdir ~/convert
DIR=~/convert
GET_TIME(){
echo "example(例子):n secs or 0:1:12"
echo "from(从):"
read FROM
echo "to(到):"
read TO
}
if [ $# -ge 1 ];then
{
echo -e "\n###### mencoder/ffmpeg convert(视频/音频转换小脚本) ######"
echo -e "code(代码)\toperation(操作)\n"
echo -e "1\tmp3+x264\n"
echo -e "2\tget video clip (copy)(截取视频)\n"
echo -e "3\tget audio clip (pcm)(截取音频)\n"
echo -e "4\tget video only (copy)(只要视频)\n"
echo -e "5\tget audio only (copy)(只要音频)\n"
echo -e "6\tmerge audio and video(合并视频音频)\n"
echo -e "7\tcustom argument 自定义\n"
echo -e "媒体信息:\n文件名:$VIDEO\n$INFO1\n$AUDIO\n$INFO2\n"
read -p "input code(请输入操作代码):" code
# echo -e "${BG}please wait.working...\n"
case $code in
1)
OUT="${VIDEO/%.???*/-x263.avi}"
mencoder "$VIDEO" -oac mp3lame -ovc x264 -o $DIR/$OUT 2>/dev/null
;;
2)
GET_TIME
OUT="${VIDEO/%.???*/-clip.avi}"
mencoder -oac mp3lame -ovc copy -ss $FROM -endpos $TO "$VIDEO" -o $DIR/$OUT 2>/dev/null
;;
3)
GET_TIME
OUT="${VIDEO/%.???*/-clip.wav}"
mencoder -oac pcm -ovc frameno -ss $FROM -endpos $TO "$VIDEO" -o $DIR/$OUT 2>/dev/null
;;
4)
OUT="${VIDEO/%.???*/-none-audio.avi}"
ffmpeg -i "$VIDEO" -an -vcodec copy $DIR/$OUT
;;
5)
read -p "please input the extension(eg: wav mp3 mp4)(输入拓展名):" extension
OUT="${VIDEO/%.???*/-audio.$extension}"
# mencoder "$VIDEO" -oac pcm -ovc frameno -o $DIR/$OUT 2>/dev/null
ffmpeg -i "$VIDEO" -acodec copy $DIR/$OUT
;;
6)
OUT="${VIDEO/%.???*/-merge.avi}"
echo -e "How to deal with video?(output video codec) 选择视频编码器\n"
select OVC in "copy" "xvid" "x264" "lavc";do
break
done
if [ $OVC = lavc ];then
echo "select libavcodec's video codecs"
select LAVC in "h263p" "mpeg4" "wmv2" "ffv1" "flv";do
OVC="lavc -lavcopts vcodec=$LAVC"
break
done
fi
echo -e "How to deal with audio?(output audio codec) 选择音频编码器\n"
select OAC in "copy" "mp3lame" "faac" "lavc";do
break
done
if [ $OAC = lavc ];then
echo "select libavcodec's audio codecs"
select LAVC in "ac3" "flac" "vorbis" "wmav2";do
OAC="lavc -lavcopts acodec=$LAVC"
break
done
fi
mencoder -audiofile "$AUDIO" "$VIDEO" -ovc $OVC -oac $OAC -mc 0 -noskip -idx -o $DIR/$OUT 2>/dev/null
;;
*)
echo "wrong code."
;;
esac
clear
echo -e "\nYour Have Got \n$DIR/$OUT"
# echo -e "\n\nJob Done!\nPlay it?(y/n)"
# read ans
# [ $ans==y ] && mplayer $OUT
}
else echo -e "File "$VIDEO" Not Found.\nUsage: convert video [audio]"
fi
[/bash]
附件
1.png
  • The eternal law
头像
naturalaw
帖子: 1360
注册时间: 2011-09-06 22:04

Re: 视频/音频处理常用操作小脚本--我凌乱了

#4

帖子 naturalaw » 2011-11-09 12:13

尽管花了些时间调试,错误还是不少。现在是v5了。把多数代码设定成函数模块。
代码数 160行了! :em03
待解决问题:
1、检测命令mencoder ffmpeg,若有一个不存在,则退出。
2、文件名修改成 basename+acodec+vcodec+extension
3、在选择音频/视频编码器时,先检测本机已安装的编码器,输出作为数组并提供选择
v5
v5
[bash]
#!/bin/bash
# by @naturalaw
# build 2011-11-06 v1
# modified 2011-11-07 v2
# modified 2011-11-08 v3
# Wed Nov 9 02:26:11 CST 2011 v4
# Wed Nov 9 12:03:53 CST 2011 v5
# 编码器选择: 设定默认值+自定义
# 所用到知识: 变量 位置变量 输出重定向 管道 echo grep 条件测试 函数 选择 条件分支 read case mencoder ffmpeg
# 函数说明
# GET_TIME() 获取截取起止时间
# SELECT_MA() 选择mencoder音频编码器
# SELECT_MV() 选择mencoder视频编码器
# SELECT_FA() 选择ffmpeg音频编码器
# SELECT_FV() 选择ffmpeg视频编码器
# ffmpeg -i /tmp/combineAudio.ogg -i /original/test.mov -acodec copy -vcodec copy /tmp/test.mov
## functions begin ##
COMMAND(){
for i in {ffmpeg,mencoder};do
which $i 2>&1 >/dev/null || echo "command "$i" not found"
done
}
GET_TIME(){
echo "example(例子):n secs or 0:1:12"
echo "from(从):"
read FROM
echo "to(到):"
read TO
}
SELECT_MV(){
echo -e "How to deal with video?(output video codec) 选择视频编码器\n"
select OVC in "copy" "xvid" "x264" "lavc";do
break
done
if [ "$OVC" = lavc ];then
echo "select libavcodec's video codecs"
select LAVC in "h263p" "mpeg4" "wmv2" "ffv1" "flv";do
OVC="lavc -lavcopts vcodec=$LAVC"
break
done
fi
}
SELECT_MA(){
echo -e "How to deal with audio?(output audio codec) 选择音频编码器\n"
select OAC in "copy" "mp3lame" "faac" "lavc";do
break
done
if [ "$OAC" = lavc ];then
echo "select libavcodec's audio codecs"
select LAVC in "ac3" "flac" "vorbis" "wmav2";do
OAC="lavc -lavcopts acodec=$LAVC"
break
done
fi
}
SELECT_FV(){
echo -e "How to deal with video?(output video codec) 选择视频编码器\n"
select OVC in "copy" "ffv1" "flv" "h263p" "mpeg4" "custom";do
break
done
if [ "$OVC" = custom ];then
read -p "input:" OVC
fi
}
SELECT_FA(){
echo -e "How to deal with audio?(output audio codec) 选择音频编码器\n"
select OAC in "copy" "aac -strict experimental" "ac3" "flac" "libmp3lame" "libvorbis" "wmav2" "custom";do
break
done
if [ "$OAC" = custom ];then
read -p "input:" OAC
fi
}
OPERATION(){
if [ $VAR -ge 1 ];then
{
echo -e "\n###### mencoder/ffmpeg convert(视频/音频转换小脚本) ######"
echo -e "code(代码)\toperation(操作)\n"
echo -e "1\t转换\n"
echo -e "2\tget video clip (截取视频)\n"
echo -e "3\tget audio clip (pcm)(截取音频)\n"
echo -e "4\tget video only (copy)(只要视频)\n"
echo -e "5\tget audio only (只要音频)\n"
echo -e "6\tmerge audio and video(合并视频音频)\n"
echo -e "7\tcustom argument 自定义\n"
echo -e "媒体信息:\n文件:$VIDEO$INFO1$AUDIO$INFO2"
if [ $VAR -eq 2 ];then
echo -e "检测到参数有2个,已自动选择合并。\n"
code=6
else
read -p "input code(请输入操作代码):" code
fi
# echo -e "${BG}please wait.working...\n"
case $code in
1)
OUT="${FILENAME/%.???*/-converted.avi}"
echo -e "mencoder or ffmpeg (选择程序)\n"
select PROGRAM in "mencoder" "ffmpeg" ;do
break
done
if [ $PROGRAM = mencoder ];then
{
SELECT_MV
SELECT_MA
# mencoder "$VIDEO" -oac mp3lame -ovc x264 -o $DIR/$OUT 2>/dev/null
mencoder "$VIDEO" -ovc $OVC -oac $OAC -mc 0 -noskip -idx -o $DIR/$OUT 2>/dev/null
}
else
{
SELECT_FV
SELECT_FA
ffmpeg -i "$VIDEO" -acodec $OAC -vcodec $OVC $DIR/$OUT
}
fi
;;
2)
GET_TIME
SELECT_MA
OUT="${FILENAME/%.???*/-clip.avi}"
mencoder -oac $OAC -ovc copy -ss $FROM -endpos $TO "$VIDEO" -o $DIR/$OUT
;;
3)
GET_TIME
OUT="${FILENAME/%.???*/-clip.wav}"
mencoder -oac pcm -ovc frameno -ss $FROM -endpos $TO "$VIDEO" -o $DIR/$OUT 2>/dev/null
;;
4)
OUT="${FILENAME/%.???*/-none-audio.avi}"
ffmpeg -i "$VIDEO" -an -vcodec copy $DIR/$OUT
;;
5)
SELECT_FA
read -p "please input the extension(eg: wav mp3 mp4)(输入拓展名):" extension
OUT="${FILENAME/%.???*/-audio.$extension}"
# mencoder "$VIDEO" -oac pcm -ovc frameno -o $DIR/$OUT 2>/dev/null
ffmpeg -i "$VIDEO" -acodec $OAC $DIR/$OUT
;;
6)
SELECT_MV
SELECT_MA
OUT="${FILENAME/%.???*/-merge.avi}"
mencoder -audiofile "$AUDIO" "$VIDEO" -ovc $OVC -oac $OAC -mc 0 -noskip -idx -o $DIR/$OUT
;;
*)
echo "wrong code."
;;
esac
echo -e "\nYour Have Got \n$(ls $DIR/$OUT)"
# echo -e "\n\nJob Done!\nPlay it?(y/n)"
# read ans
# [ $ans==y ] && mplayer $OUT

}
else echo -e "\nUsage: avconvert video [audio]"
fi
}
## functions end ##

VAR=$#
BG="\e[32;40m"
OUT=''
VIDEO="$1"
FILENAME="${VIDEO##*/}"
AUDIO="$2"
INFO1=$(echo -e "\n$(ffmpeg -i "$VIDEO" 2>&1 | grep -P '(Duration|Stream)' | grep -v Data)\n")
INFO2=$(echo -e "\n$(ffmpeg -i "$AUDIO" 2>&1 | grep -P '(Duration|Stream)' | grep -v Data)\n")
DIR=/tmp/convert
[ -d $DIR ] || mkdir $DIR
COMMAND
OPERATION

[/bash]
上次由 naturalaw 在 2011-11-09 12:20,总共编辑 1 次。
  • The eternal law
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 视频/音频处理常用操作小脚本--我凌乱了

#5

帖子 eexpress » 2011-11-09 12:18

咋功能说明都不贴。。
● 鸣学
头像
naturalaw
帖子: 1360
注册时间: 2011-09-06 22:04

Re: 视频/音频处理常用操作小脚本--我凌乱了

#6

帖子 naturalaw » 2011-11-09 12:35

eexpress 写了:咋功能说明都不贴。。
:em06 真不好意思。现在就贴。
在选择可以ffmpeg时,可以手动输入编码器
脚本功能:
1 视频转码

2 截取视频/音频

3 提取视频/音频

4 合并视频音频
  • The eternal law
回复