分类: Video
发布: yaosansi
浏览:
日期: 2008年4月22日
经过一次不痛快的和他人合作之后,我写了这段shell脚本,主要用于视频文件的转换队列处理,和视频大文件的截取.涉及到诸如3gp,asf,wmv,avi,mp4,mpeg,mov,vob,rm,rmvb等格式的转换成flv,同时分段截取各种格式的大文件.主要采用的工具无非就是开源的ffmpeg,mencoder,MediaInfo,前两者转换和截取,后者获取视频元数据.多谢sleetdrop推荐.
对于视频文件的元数据而言,是否都存在都柏林元数据,特征元数据是否值得信赖是一个问题,因此在脚本中做了一些信任机制的处理,脚本写的很清晰,应该不是太难懂,而且里面都做了撇脚的英文注释.已经通过功能测试,至于压力测试,正在进行中.不过对于脚本运行环境,是在ffmpeg+mencoder环境下运行的,对于怎样搭建ffmpeg+mencoder,可以参考这篇文章.
可能会要应用于实际比较恶劣的情况中,因此还需要对代码进行改进,甚至可能要用到shc,日志功能和错误处理功能还要加强,还有就是根据不同格式和不同质量的视频文件,采用不同的方法进行转换也是在下一步策划之中.如果大家有什么更好的方法,或者对此进行了改进,请共享出来吧.
分类: Video
发布: yaosansi
浏览:
日期: 2008年4月22日
截取一张352x240尺寸大小的,格式为jpg的图片:
ffmpeg -i test.asf -y -f image2 -t 0.001 -s 352x240 a.jpg
把视频的前30帧转换成一个Animated Gif :
ffmpeg -i test.asf -vframes 30 -y -f gif a.gif
目前还没有找到截取任意一帧为图片的方法。
分类: Video
发布: yaosansi
浏览:
日期: 2008年4月22日
今天利用FFmpeg -h > ffmpeg.txt,把FFmpeg的命令打印出来后,才发现了这一参数:
-ss time_off set the start time offset
使用-ss参数,可以从指定的时间开始处理转换任务.如:
ffmpeg -i test2.asf -y -f image2 -ss 08.010 -t 0.001 -s 352x240 b.jpg
那么从任意一帧截图的问题也就解决了.只要-ss后的时间参数是随机产生,并且在视频的有效时间内,就可以了.
另外,-ss后跟的时间单位为秒。
分类: Video
发布: yaosansi
浏览:
日期: 2008年4月22日
先从ffmpeg开始。
http://ffmpeg.sourceforge.net上有说明,音视频的分离,转换,解码的完全解决方案。
其中最重要的就是libavcodec库。它被mplayer或者xine使用作为解码器。还有,国内比较流行的播放器影音风暴或MyMPC的后端ffdshow也是使用ffmpeg的解码库的。
ffmpeg包括一组软件,ffmpeg用于对媒体文件进行处理,ffserver是一个http的流媒体服务器,ffplay是一个基于SDL的简单播放器。两个库文件libavcodec和libavformat。
ffmpeg作为媒体文件处理软件,基本用法如下:
ffmpeg -i INPUTfile [OPTIONS] OUTPUTfile
输入输出文件通常就是待处理的多媒体文件了。可以是纯粹的音频文件,纯粹的视频文件,或者混合的。
大部分常见的格式都能够“通杀”。象常见的各种mpeg,AVI封装的DIVX和Xvid等等
具体的格式支持列表可以使用ffmpeg -formats查看或直接查阅文档。
分类: Video
发布: yaosansi
浏览:
日期: 2008年4月22日
有很多软件能够截取影片图像、合并图像,但如果影片太多,比如视频网站为用户上传的图像生成预览图之类的,人工在gui方式下操作就不可取了,我们需要在命令行方式下来截取、合并。
首先,截取影片图像使用最多的就是mplayer或者ffmpeg,我用mplayer比较熟,本文就以此为例了,ffmpeg功能也是非常强大的,但据说支持的文件格式却不丰富。mplayer截取影片图像的基本命令为:
mplayer -ss START_TIME -noframedrop -nosound -vo jpeg -frames N NAME_OF_VIDEO_FILE
上例中,-ss指定开始的时间,结合-frames参数,限定从某个时间开始、截取几帧图像。为了体现整个影片的内容,我需要在影片中间隔时间相同的几个点、每个点截取1帧图像,所以按道理应该用-frames 1,但是mplayer这样截图的情况下,第一帧似乎永远都会截取到一个黑屏,所以我常用-frames 2。截取下来的图像保存在了当前目录,名称从00000001.jpg开始依次递增,按照-frames 2,就是取00000002.jpg为结果,删除00000001.jpg即可。经过简单实验,在截取wmv、rmvb影片时,前面的好几帧都会是黑屏,也只能参考上面的做法多取几帧了。
为了取影片中间隔大致相同的几个点,可以用-ss指定时间,也可以用-sb指定开始字节,在我的实际使用中,使用-sb只会得到黑屏,所以通过文件大小来设置间隔点的办法不行,只能用-ss时间间隔了,这就需要首先得到影片的总时间。好在mplayer为我们提供了类似的功能:
mplayer -identify movie-filename -nosound -vc dummy -vo null
分类: Video
发布: yaosansi
浏览:
日期: 2008年4月22日
ffmpeg+mencoder几乎可以完成目前基于web的播客平台任何音视频处理的操作.如果还需要添加一些什么的话,那么就是视频在线录制功能了,这个也可以用ffmpeg+fms来完成,因此一般的类似于YouTube的一些可见功能都可以在ffmpeg+mencoder+fms来做后台实现.由于fms没有实践,因此这里不描述.
本文档有三部分:
1)ffmpeg+mencoder环境搭建
2)常见操作说明
3)个人的一些使用心得
1.ffmpeg+mencoder环境搭建
1)概论
音视频界众多的编解码协议和各个公司定义的专用格式导致目前的视频音频文件纷繁复杂,单纯的ffmpeg支持的格式并不完全包括所有种类,至少swf,rmvb(rv4)目前的版本是不支持的.同时wma9似乎可以支持了.但没有测试.同时mencoder能支持rm,rmvb等格式,但是从视频中获取某帧截图的工作只能由ffmpeg完成.因此可以采用ffmpeg+mencoder完成目前所有流行格式的视频压缩转换,设置视频信息,截取视频中的图片等功能了,同时,采用其他的一些开源工具如MediaInfo可以获取视频的元数据信息.
分类: Video
发布: yaosansi
浏览:
日期: 2008年4月22日
下载电影的时候,我们总希望在全部下载完成之前能够预览一下影片内容,于是发布者时常会放一些影片截图在种子文件中,或者直接贴到网上,也有一些截图是一张图片,但包含很多幅影片在一起,就像下面这张:

有很多软件能够截取影片图像、合并图像,但如果影片太多,比如视频网站为用户上传的图像生成预览图之类的,人工在gui方式下操作就不可取了,我们需要在命令行方式下来截取、合并。
首先,截取影片图像使用最多的就是mplayer或者ffmpeg,我用mplayer比较熟,本文就以此为例了,ffmpeg功能也是非常强大的,但据说支持的文件格式却不丰富。mplayer截取影片图像的基本命令为:
mplayer -ss START_TIME -noframedrop -nosound -vo jpeg -frames N NAME_OF_VIDEO_FILE
上例中,-ss指定开始的时间,结合-frames参数,限定从某个时间开始、截取几帧图像。为了体现整个影片的内容,我需要在影片中间隔时间相同 的几个点、每个点截取1帧图像,所以按道理应该用-frames 1,但是mplayer这样截图的情况下,第一帧似乎永远都会截取到一个黑屏,所以我常用-frames 2。截取下来的图像保存在了当前目录,名称从00000001.jpg开始依次递增,按照-frames 2,就是取00000002.jpg为结果,删除00000001.jpg即可。经过简单实验,在截取wmv、rmvb影片时,前面的好几帧都会是黑屏, 也只能参考上面的做法多取几帧了。
为了取影片中间隔大致相同的几个点,可以用-ss指定时间,也可以用-sb指定开始字节,在我的实际使用中,使用-sb只会得到黑屏,所以通过文件 大小来设置间隔点的办法不行,只能用-ss时间间隔了,这就需要首先得到影片的总时间。好在mplayer为我们提供了类似的功能:
分类: Video
发布: yaosansi
浏览:
日期: 2008年4月22日
ffmpeg文件大家可到官网下载了,注意ffmpeg的参数,和之间的空格!
使用时也要注意,文件有读写权限和.net调用ffmpeg的权限,自己没服务器,建议就不要使用了.
以下是引用片段:
if (MoveFileName.Substring(MoveFileName.LastIndexOf(".")) == ".wmv" || MoveFileName.Substring(MoveFileName.LastIndexOf(".")) == ".3gp")
{
//程序截图
string ffmpeg = Server.MapPath("ffmpeg/ffmpeg.exe");
string move = Server.MapPath("upfile/" + RMoveFileName);
pic = Myfunction.MakeNum(5) + Myfunction.MakeFileName() + ".jpg";
Process p = new Process();
p.StartInfo.FileName = ffmpeg;
p.StartInfo.Arguments = "-i " + move + " -y -f image2 -t 0.001 -s 120*120 " + Server.MapPath("upfile/img/" + pic);
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.RedirectStandardOutput = true;
try
{
p.Start();
p.Dispose();
p.Close();
}
catch (Exception ee)
{
Response.Write(ee.ToString());
}
}
分类: Video
发布: yaosansi
浏览:
日期: 2008年4月22日
我们在将多种格式的视频转换成flv格式的时候,我们关注的就是转换后的flv视频的品质和大小。下面就自己的实践所得来和大家分享一下,主要针对avi、3gp、mp4和wmv四种格式来进行分析。通常在使用ffmpeg进行视频转换的时候我们使用到的控制音视频的主要参数有如下:
-ab bitrate 设置音频码率
-acodec codec 使用codec编解码
-ac channels 设置通道,缺省为1
-ar freq 设置音频采样率
-r fps 设置帧频,缺省25
-b bitrate 设置比特率,缺省200kb/s
-qscale 6或4 使用动态码率来设置
对于其他诸如-i、-y、-s等参数基本上都是可以很好理解的了。我们上面提到的几个参数前四个主要是用来设置音频的,后三个主要是用来设置视频的。对于音频的ar(采样率)可以指定为22050、24000、44100或48000,一般来将后两种比较常见;对于音频的ab(码率)一般是选择32、64、96或128这几种;对音频的acodec则是指定编码方式,可以指定为libmp3lame或aac等,这两种分别是指使用mp3和aac格式的音频。在实际的测试过程中我发现在使用mp3进行音频编码时指定ab为64或更高和指定ar为22050或更高对实际的视频音质没有什么大的影响,请参见后面的测试结果。
分类: Video
发布: yaosansi
浏览:
日期: 2008年4月22日
昨天因为要将相机拍摄的视频刻录成VCD,于是上网找了好多MPEG的相关工具,如切割、合并、格式转换等,大部分都是共享软件并且还有功能限制。后来实在没办法了,想到了ffmpeg这个工具,抱着试试看的心情看了看帮助,才发现原来真正的工具在这里!支持绝大多数常见的视频音频格式,可以在各种格式之间随意转换,支持视频切割。所以说,真正好用的东西其实都是免费的。
ffmpeg的命令行格式如下:
ffmpeg [输入参数] -i 输入文件 [输出参数] 输出文件
这里仅举几个我用到的例子。