在ASP.Net中实现flv视频转换的代码
程序员文章站
2023-09-20 12:41:36
实际上是利用.net中的process对象来实现的。 string str=@"d:\test.avi ...
实际上是利用.net中的process对象来实现的。
string str=@"d:\test.avi d:\test_allen.flv";
runffmpeg(str);
//运行ffmpeg的视频解码,
public void runffmpeg(string strcmd)
{
//创建并启动一个新进程
process p = new process();
//设置进程启动信息属性startinfo,这是processstartinfo类,包括了一些属性和方法:
p.startinfo.filename = "ffmpeg.exe"; //程序名
p.startinfo.arguments = " -i " + strcmd; //执行参数
p.start();
}
//运行cmd.exe执行dos 命令,并返回执行结果
public string runcmd(string command)
{
//创建并启动一个对进程
process p = new process();
//process类有一个startinfo属性,这是processstartinfo类,包括了一些属性和方法,例如:
p.startinfo.filename = "cmd.exe"; //程序名
p.startinfo.arguments = " /c " + command; //执行参数
p.startinfo.useshellexecute = false; //关闭shell的使用
p.startinfo.redirectstandardinput = true; //重定向标准输入
p.startinfo.redirectstandardoutput = true; //重定向标准输出
p.startinfo.redirectstandarderror = true; //重定向错误输出
p.startinfo.createnowindow = true; //设置不显示窗口
p.start();
//p.standardinput.writeline(command); //也可以用這種方式輸入要執行的命令
//p.standardinput.writeline("exit"); //不過要記得加上exit要不然下一行程式執行的時候會當機
//必须创建可以自动转换完成以后,结束进程的代码
return p.standardoutput.readtoend(); //從輸出流取得命令執行結果
}
------------------------------------
另一种方法: 用mencoder转换视频文件为flv
mencoder 转换视频注意事项
1、下载 mencoder.exe 和 mplayer.exe
2、将mencoder.exe 所在文件夹,加入环境变量path里面 ,如c:\mplayer
3、微软键+r,输入cmd,命令行打入如下语法
mencoder d:\test.avi -o d:\testflv.flv -of lavf -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames -oac mp3lame -lameopts abr:br=56 -ovc lavc -lavcopts vcodec=flv:vbitrate=100:mbd=2:mv0:trell:v4mv:cbp:last_pred=3:dia=4:cmp=6:vb_strategy=1 -vf scale=512:-3 -ofps 12 -srate 22050
语法说明:
mencoder d:\test.avi -o d:\testflv.flv //将d:\test.avi 输出到 d:\testflv.flv, 参数 -o 代表输出路径
-of lavf //参数 -of :输出文件的格式,flv文件是属于lavf格式
-lavfopts i_certify_that_my_video_stream_does_not_use_b_frames //lavf格式的参数设置,对于转换flv格式,最好加上这个长句。意思是不用bframes。
-oac mp3lame //输出音频编码器,这里用的mp3lame
-lameopts abr:br=56 //是专门针对mp3lame的参数设置,abr:br=56,是设置音频比特率为56
-ovc lavc //输出视频编码器
//视频编码器的设置:
-lavcopts
vcodec=flv: //指定视频编码器为flv
vbitrate=500: //指定视频比特率为500 ,低品质为150kb/s,中等品质为400kb/s,高品质为700kb/s
mbd=2: //宏模块选择算法,值为0~2默认为0,值越大转换越缓慢,但在品质和文件大小方面有好处
mv0: //编译每个宏模块并选择最好的一个,当mbd=0时无效;
trell: //会稍微增加品质,mbd>0时效果更明显;
v4mv: //量子化网格搜索,对每8×8block找到最优化编码
cbp: //只能和trell一期使用,评估失真的图像块编码;
last_pred=3: //与上一帧相比的移动数量预测,值为0~99,1~3比较合适,大于3时对品质的提高已经无关紧要,但却会降低速度;
dia=4: //移动搜索范围,值为-99~6,对于快速转换,-1是个不错的值,如果不是很重视速度,可以考虑2~4;
cmp=6: //值为1~2000,默认为0,设置用于全象素移动预算的比较函数
vb_strategy=1 //对动作很大的场景会有帮助,对有些视频,设置vmax_b_frames会有损品质,加上vb_strategy=1会好点。
//mencoder的参数
-vf scale=512:-3 //-vf表示视频格式scale是缩放,512:-3表示强制将宽度设置为512,高度写为-3表示保持高宽比,也可以设置为-1或-2,
-ofps 12 /*输出视频的帧频,一般,用于flash播放的视频帧频高了没有意义,反而会增加视频文件大小,但如果ofps设置的不合适,
比如源视频帧频不是ofps的整数倍,可能会导致转换后的视频、音频不同步,
似乎可以将这一参数改为-noskip来解决这一问题;*/
-srate 22050 //音频采样率一般为22050或44100。
----------------------------------------------------------
mencoder中文参考手册地址
http://www.mplayerhq.hu/docs/html/zh_cn/
----------------------------------------------------------
参数说明:
-srate 32000 : //声音采样率,22050hz
-af channels=2:2:1:0:1:1 //右声道
-af channels=2:2:0:0:0:1 //左声道
-stereo 0 //立体声
-oac mp3lame : //输出音频使用mp3编码
-lameopts mode=2:cbr:br=32 : //码率br=32 kbit
-ovc xvid -xvidencopts bitrate=200 : //以xvid方式编码,码率200kbps (经实验,目前divx比xvid要快,在使用vhq功能时会稍稍影响速度)
-vf scale=480:-3 -sws 9 : //变换至480像素宽,高度按比例缩放
"c:\dance.avi" -o "c:\dance.xvid.avi" //源文件地址 -o到 输出文件地址
2> 2.txt : //编码日志记录地址
--------------------参数选择分析------------------------
18fps:这是以前通过多次测试得来的,一般电视剧和动画片15fps就够用了。如果场景变换不是很大,13fps就能保证播放流畅。降低fps值可以使压缩速度更快,对于电影,特别是动作片,要保证流畅无马赛克,就要提高fps,最大24就够了
选择18fps足以应付大部分,性价比高
音频采样率32khz:从录音设备的得来的灵感(以下质量说明为比喻,前面的参数时原有的)
32khz - 32kbps - mono比电话音好些
44khz - 64kbps - j-stereo 收音机质量
44khz -128kbps - j-stereo 通行的mp3标准质量
44khz -192kbps - stereo接近cd质量
经过多次试验(以上是区间范围,自己可以根据需要选择)
压片最省空间 - 使用32khz - 32kbps - mono,可以保证内容;
质量要求不高 - 可用32khz - 128kbps - mono 性价比比较高;
空间大高质量 - 44khz -192kbps - stereo对大sd卡用户。
视频采样率bitrate=150:
80 - 最小空间占用率,质量最差 转换速度稍快 (与最低音频配合,大小可1min=1m)
122 - 对底配置机器的小卡用户性价比较高(换面变化快回有马赛克)
150 - 满足底配置机器对画质的基本要求(对非动作片比较完美)
248 - 大卡用户的经济选择 (质量较好)
350 - 大卡高配置的机器 (经济的体现机器优势)
更高- 用户自己试吧
总的来说,输出文件的大小受视频采样率、音频采样率影响效果显著,画面尺寸、fps值也影响大小。怎样设置参数要看你的个人实际需要与机器配置。
另外,还有很多不知道的参数,请大家找找看。
比如:pess2、pess3、动态fps、屏幕截取、时间区间设置等
------------------------------------------------------------------
关于音量调节:
carlwang 写道:个人习惯是不用耳机的,天热带着不舒服,所以声音我一向偏大。
我的经验如果片源是dvdrip,一般在5以上,如果是rmvb一般2就够了,再大就有爆音了。
-oac mp3lame -lameopts mode=2:cbr:br=64:vol=2 大家来试试看吧
------------------------------------------------------------------------
转换结束,会显示
pos: 226.8s 297f (100%) 48fps trem: 0min 5mb a-v:-0.009 [142:56]
这里边的内容,小括号里应该是转换的进度,中括号里的内容很重要,142表示视频比特率,56表示音频比特率(比特率这个词不知道用的对不对......)
转换结束,会显示2行文字:
video stream: 142.564 kbit/s (17820 b/s) size: 4046677 bytes 227.080 secs 2700 frames
audio stream: 56.938 kbit/s (7117 b/s) size: 1616197 bytes 227.082 secs
这2行信息我想大家都能明白,其中我一直关注的是那个142.564kbit/s,
用过flash8自带转换工具的应该知道高级设置里有个选项是最大数据速率,
当选中中等画质的时候,是400kb/s,而低品质也是150kb/s,也就是说,用那句命令转换的视频,其画质都不如品质的,那么,品质怎么样呢?
看一下命令:
mencoder "d:\music.wmv" -o "d:\output.flv" -of lavf -oac mp3lame -lameopts abr:br=56 -ovc lavc -lavcopts vcodec=flv:vbitrate=150:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -srate 22050
分析:
-ovc > 大概是output video codec的缩写,制定输出视频编码,选用的lavc,什么意思?说是用了libavcodec的编码器;
-lavcopts > 是lavc的options选项设置
要设置视频编码的参数了!
codec=flv > 说的是用的flv编码器,这个咱不理;
vbitrate=150 > video bit rate!视频数据速率!就是它了!原来我设的是150啊!
改成vbitrate=1000,再试试看!
结果,和前一次一模一样......
冷静下来,去往上看了一下官方文档,这个参数是最大数据速率,最大嘛,你设多大都一样啊,看来不是靠它来控制品质。
结论,设置品质有2种途径:
1、设置-lavcopts,看这样一句命令:
-lavcopts vcodec=flv:vbitrate=500:mbd=2:mv0:trell:v4mv:cbp:last_pred=3:dia=4:cmp=6:vb_strategy=1
在-lavcopts里dia=4:cmp=6:vb_strategy=1这3条
dia越大品质越高,如果需要快速编码,设置为-1,设为4时已经很有利于品质了;
cmp越大品质越高,默认值0,是最快速的,一般设到3,设为6已经只会细微提高品质了,但速度会慢
vb_strategy,大概是1或者0,默认值可能为0,我这里设为1,会对编码有帮助,这个参数我自己没有过多推敲,可能并不影响品质......
2、加-sws选项,看下面的命令:
-sws 3
只是加一个3进去,转换后的效果和前面一种方法大致相同,视频数据速率都是422.5kb/s左右,解释一下
-sws就是用来设置品质的,默认值为2,那么,为什么不用这种简单的方式呢?我个人认为,用前面一种方法有利于找到一个速度和品质的平衡点,毕竟变化的范围比较大。
个人见解:
如此视频格式的转换,最好使用客户端转换,转换好了再传到服务端,因此需要做客户端的一个视频上传小软件
string str=@"d:\test.avi d:\test_allen.flv";
runffmpeg(str);
//运行ffmpeg的视频解码,
public void runffmpeg(string strcmd)
{
//创建并启动一个新进程
process p = new process();
//设置进程启动信息属性startinfo,这是processstartinfo类,包括了一些属性和方法:
p.startinfo.filename = "ffmpeg.exe"; //程序名
p.startinfo.arguments = " -i " + strcmd; //执行参数
p.start();
}
//运行cmd.exe执行dos 命令,并返回执行结果
public string runcmd(string command)
{
//创建并启动一个对进程
process p = new process();
//process类有一个startinfo属性,这是processstartinfo类,包括了一些属性和方法,例如:
p.startinfo.filename = "cmd.exe"; //程序名
p.startinfo.arguments = " /c " + command; //执行参数
p.startinfo.useshellexecute = false; //关闭shell的使用
p.startinfo.redirectstandardinput = true; //重定向标准输入
p.startinfo.redirectstandardoutput = true; //重定向标准输出
p.startinfo.redirectstandarderror = true; //重定向错误输出
p.startinfo.createnowindow = true; //设置不显示窗口
p.start();
//p.standardinput.writeline(command); //也可以用這種方式輸入要執行的命令
//p.standardinput.writeline("exit"); //不過要記得加上exit要不然下一行程式執行的時候會當機
//必须创建可以自动转换完成以后,结束进程的代码
return p.standardoutput.readtoend(); //從輸出流取得命令執行結果
}
------------------------------------
另一种方法: 用mencoder转换视频文件为flv
mencoder 转换视频注意事项
1、下载 mencoder.exe 和 mplayer.exe
2、将mencoder.exe 所在文件夹,加入环境变量path里面 ,如c:\mplayer
3、微软键+r,输入cmd,命令行打入如下语法
mencoder d:\test.avi -o d:\testflv.flv -of lavf -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames -oac mp3lame -lameopts abr:br=56 -ovc lavc -lavcopts vcodec=flv:vbitrate=100:mbd=2:mv0:trell:v4mv:cbp:last_pred=3:dia=4:cmp=6:vb_strategy=1 -vf scale=512:-3 -ofps 12 -srate 22050
语法说明:
mencoder d:\test.avi -o d:\testflv.flv //将d:\test.avi 输出到 d:\testflv.flv, 参数 -o 代表输出路径
-of lavf //参数 -of :输出文件的格式,flv文件是属于lavf格式
-lavfopts i_certify_that_my_video_stream_does_not_use_b_frames //lavf格式的参数设置,对于转换flv格式,最好加上这个长句。意思是不用bframes。
-oac mp3lame //输出音频编码器,这里用的mp3lame
-lameopts abr:br=56 //是专门针对mp3lame的参数设置,abr:br=56,是设置音频比特率为56
-ovc lavc //输出视频编码器
//视频编码器的设置:
-lavcopts
vcodec=flv: //指定视频编码器为flv
vbitrate=500: //指定视频比特率为500 ,低品质为150kb/s,中等品质为400kb/s,高品质为700kb/s
mbd=2: //宏模块选择算法,值为0~2默认为0,值越大转换越缓慢,但在品质和文件大小方面有好处
mv0: //编译每个宏模块并选择最好的一个,当mbd=0时无效;
trell: //会稍微增加品质,mbd>0时效果更明显;
v4mv: //量子化网格搜索,对每8×8block找到最优化编码
cbp: //只能和trell一期使用,评估失真的图像块编码;
last_pred=3: //与上一帧相比的移动数量预测,值为0~99,1~3比较合适,大于3时对品质的提高已经无关紧要,但却会降低速度;
dia=4: //移动搜索范围,值为-99~6,对于快速转换,-1是个不错的值,如果不是很重视速度,可以考虑2~4;
cmp=6: //值为1~2000,默认为0,设置用于全象素移动预算的比较函数
vb_strategy=1 //对动作很大的场景会有帮助,对有些视频,设置vmax_b_frames会有损品质,加上vb_strategy=1会好点。
//mencoder的参数
-vf scale=512:-3 //-vf表示视频格式scale是缩放,512:-3表示强制将宽度设置为512,高度写为-3表示保持高宽比,也可以设置为-1或-2,
-ofps 12 /*输出视频的帧频,一般,用于flash播放的视频帧频高了没有意义,反而会增加视频文件大小,但如果ofps设置的不合适,
比如源视频帧频不是ofps的整数倍,可能会导致转换后的视频、音频不同步,
似乎可以将这一参数改为-noskip来解决这一问题;*/
-srate 22050 //音频采样率一般为22050或44100。
----------------------------------------------------------
mencoder中文参考手册地址
http://www.mplayerhq.hu/docs/html/zh_cn/
----------------------------------------------------------
参数说明:
-srate 32000 : //声音采样率,22050hz
-af channels=2:2:1:0:1:1 //右声道
-af channels=2:2:0:0:0:1 //左声道
-stereo 0 //立体声
-oac mp3lame : //输出音频使用mp3编码
-lameopts mode=2:cbr:br=32 : //码率br=32 kbit
-ovc xvid -xvidencopts bitrate=200 : //以xvid方式编码,码率200kbps (经实验,目前divx比xvid要快,在使用vhq功能时会稍稍影响速度)
-vf scale=480:-3 -sws 9 : //变换至480像素宽,高度按比例缩放
"c:\dance.avi" -o "c:\dance.xvid.avi" //源文件地址 -o到 输出文件地址
2> 2.txt : //编码日志记录地址
--------------------参数选择分析------------------------
18fps:这是以前通过多次测试得来的,一般电视剧和动画片15fps就够用了。如果场景变换不是很大,13fps就能保证播放流畅。降低fps值可以使压缩速度更快,对于电影,特别是动作片,要保证流畅无马赛克,就要提高fps,最大24就够了
选择18fps足以应付大部分,性价比高
音频采样率32khz:从录音设备的得来的灵感(以下质量说明为比喻,前面的参数时原有的)
32khz - 32kbps - mono比电话音好些
44khz - 64kbps - j-stereo 收音机质量
44khz -128kbps - j-stereo 通行的mp3标准质量
44khz -192kbps - stereo接近cd质量
经过多次试验(以上是区间范围,自己可以根据需要选择)
压片最省空间 - 使用32khz - 32kbps - mono,可以保证内容;
质量要求不高 - 可用32khz - 128kbps - mono 性价比比较高;
空间大高质量 - 44khz -192kbps - stereo对大sd卡用户。
视频采样率bitrate=150:
80 - 最小空间占用率,质量最差 转换速度稍快 (与最低音频配合,大小可1min=1m)
122 - 对底配置机器的小卡用户性价比较高(换面变化快回有马赛克)
150 - 满足底配置机器对画质的基本要求(对非动作片比较完美)
248 - 大卡用户的经济选择 (质量较好)
350 - 大卡高配置的机器 (经济的体现机器优势)
更高- 用户自己试吧
总的来说,输出文件的大小受视频采样率、音频采样率影响效果显著,画面尺寸、fps值也影响大小。怎样设置参数要看你的个人实际需要与机器配置。
另外,还有很多不知道的参数,请大家找找看。
比如:pess2、pess3、动态fps、屏幕截取、时间区间设置等
------------------------------------------------------------------
关于音量调节:
carlwang 写道:个人习惯是不用耳机的,天热带着不舒服,所以声音我一向偏大。
我的经验如果片源是dvdrip,一般在5以上,如果是rmvb一般2就够了,再大就有爆音了。
-oac mp3lame -lameopts mode=2:cbr:br=64:vol=2 大家来试试看吧
------------------------------------------------------------------------
转换结束,会显示
pos: 226.8s 297f (100%) 48fps trem: 0min 5mb a-v:-0.009 [142:56]
这里边的内容,小括号里应该是转换的进度,中括号里的内容很重要,142表示视频比特率,56表示音频比特率(比特率这个词不知道用的对不对......)
转换结束,会显示2行文字:
video stream: 142.564 kbit/s (17820 b/s) size: 4046677 bytes 227.080 secs 2700 frames
audio stream: 56.938 kbit/s (7117 b/s) size: 1616197 bytes 227.082 secs
这2行信息我想大家都能明白,其中我一直关注的是那个142.564kbit/s,
用过flash8自带转换工具的应该知道高级设置里有个选项是最大数据速率,
当选中中等画质的时候,是400kb/s,而低品质也是150kb/s,也就是说,用那句命令转换的视频,其画质都不如品质的,那么,品质怎么样呢?
看一下命令:
mencoder "d:\music.wmv" -o "d:\output.flv" -of lavf -oac mp3lame -lameopts abr:br=56 -ovc lavc -lavcopts vcodec=flv:vbitrate=150:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -srate 22050
分析:
-ovc > 大概是output video codec的缩写,制定输出视频编码,选用的lavc,什么意思?说是用了libavcodec的编码器;
-lavcopts > 是lavc的options选项设置
要设置视频编码的参数了!
codec=flv > 说的是用的flv编码器,这个咱不理;
vbitrate=150 > video bit rate!视频数据速率!就是它了!原来我设的是150啊!
改成vbitrate=1000,再试试看!
结果,和前一次一模一样......
冷静下来,去往上看了一下官方文档,这个参数是最大数据速率,最大嘛,你设多大都一样啊,看来不是靠它来控制品质。
结论,设置品质有2种途径:
1、设置-lavcopts,看这样一句命令:
-lavcopts vcodec=flv:vbitrate=500:mbd=2:mv0:trell:v4mv:cbp:last_pred=3:dia=4:cmp=6:vb_strategy=1
在-lavcopts里dia=4:cmp=6:vb_strategy=1这3条
dia越大品质越高,如果需要快速编码,设置为-1,设为4时已经很有利于品质了;
cmp越大品质越高,默认值0,是最快速的,一般设到3,设为6已经只会细微提高品质了,但速度会慢
vb_strategy,大概是1或者0,默认值可能为0,我这里设为1,会对编码有帮助,这个参数我自己没有过多推敲,可能并不影响品质......
2、加-sws选项,看下面的命令:
-sws 3
只是加一个3进去,转换后的效果和前面一种方法大致相同,视频数据速率都是422.5kb/s左右,解释一下
-sws就是用来设置品质的,默认值为2,那么,为什么不用这种简单的方式呢?我个人认为,用前面一种方法有利于找到一个速度和品质的平衡点,毕竟变化的范围比较大。
个人见解:
如此视频格式的转换,最好使用客户端转换,转换好了再传到服务端,因此需要做客户端的一个视频上传小软件
推荐阅读
-
php ucwords() 函数将字符串中每个单词的首字符转换为大写(实现代码)
-
iOS在Block中修改外部变量值的实现代码
-
C#中的DataSet、string、DataTable、对象转换成Json的实现代码
-
iOS在Block中修改外部变量值的实现代码
-
在ASP.NET 2.0中操作数据之十:使用 GridView和DetailView实现的主/从报表
-
java中把汉字转换成简拼的实现代码
-
C#中的DataSet、string、DataTable、对象转换成Json的实现代码
-
Android在OnCreate中获取控件的宽度和高度的实现代码
-
在ASP.NET 2.0中操作数据之十:使用 GridView和DetailView实现的主/从报表
-
vbs打开ie两种方法 在VBScript中启动IE浏览器的实现代码