FFMPEG的用法


FFMPEG是一个视频软件的装换工具。




DOS下的操作如下:




ffmpeg 转换




D:\ffmpeg\bin>ffmpeg.exe -i C:\Users\pc\Desktop\sp.mp4 -vf scale=500:-1 -t 100 ss.flv




C:\Users\pc\Desttop\sp.mp4 是所需要转换的文件地址




scale=500:-1 表示准换后的视频的宽度为500px -1表示高度自适应,也可以写成500:500,表示宽度和高度都是500px




-t 100 表示截取的视频的时间为100毫秒,




ss.flv表示命名的新文件名,文件存放在D盘.




ffmpeg 截图




ffmpeg -i demo.mp4 -ss 10.1 -t 0.001 1.jpg




截取demo.mp4的视频 从10.1秒开始 -t 0.001表示截取10.1秒的这张图片 保存为 1.jpg




ffmpeg 裁剪




ffmpeg -i demo.mp4 -filter:v "crop=10:20:100:100" out.mp4




crop里的参数依次为: 左边距:右边距:宽度:高度




ffmpeg 相同分辨率转flv




ffmpeg -i demo.mp4 -vcodec copy -acodec copy out.flv




Ipad 可以直接播放mp4,可以用html5的video标签




<video width="555" height="315" controls preload="auto" src="demo.mp4"></video>




 




ffmpeg 视频合成




因为 ffmpeg 是支持切分 mp4 视频的,所以我就理所当然的以为 ffmpeg 是支持视频合并。直到今天同事找我问方法,才发现一直以为的方法是错误的, mp4 不支持直接 concate(丢人了。。。),赶紧补了一下能量,从网上抓来了多种实现。




注: 这里的 mp4 指的是网上最多见的 h264+aac mpeg4 容器的方式




ffmpeg + ts




这个的思路是先将 mp4 转化为同样编码形式的 ts 流,因为 ts流是可以 concate 的,先把 mp4 封装成 ts ,然后 concate ts 流, 最后再把 ts 流转化为 mp4。




1


2


3


ffmpeg -i 1.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 1.ts


ffmpeg -i 2.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 2.ts


ffmpeg -i "concat:1.ts|2.ts" -acodec copy -vcodec copy -absf aac_adtstoasc output.mp4


  




关于页面视频播放的一些总结




1.如果文件比较大的话一般只能播放流媒体格式的文件,比如flv格式,采用边下载边播放的形式,所以如果文件不是flv格式的话需要按照上面所介绍的转换方式进行转换。




2.文件的码率会影响下载的速度,如果当前网络为1M,那么想要流畅的播放视频文件的话,播放的文件的码率必须在1024Kbps以下,否则就需要进行转换,以达到最佳播放效果。




更多关于Ffmpeg的介绍 http://ffmpeg.org/




更多关于Jplayer的介绍 http://www.jplayer.org/


参考二:

转自:http://suncup.info/2014/07/ffmpeg_concatenate_h264/


使用FFMPEG命令行裁剪合并MP4封装的H.264视频音频流

最近因为工作上的关系又要重操旧业折腾视频编码了,而且这次更偏向实际应用一些。

工作时使用到的工具:

CamStudio - 屏幕录像,可录音。Free, GPL license

MediaCoder - Audio/Video Transcode Interface

FFmpeg - Audio/Video CODEC Converter. Free, LGPL

StreamEye - 视频码流分析器。Commercial

YUVviewer - YUV RAW码流播放器

MediaPlayer

这次的工作是为了录制一次培训讲座中Lab部分的演示。录制很麻烦,起码NG了千万次,而且有过长时间的返工。那么最后为了减少重新录制的麻烦,我选择了输出片段的方式。期望依靠后期处理来进行裁剪和合并的操作。但我并没有Adobe Premier这种非线性编辑器,所以就略显麻烦。折腾很久。

首先CamStudio输出的视频是AVI封装,视频为CamStudio专用编码、音频则是PCM。所以第一步是将这个原始的AVI码流使用MediaCoder的界面小批量地将它用x264编码,Baseline profile@L3.1。这样可以在其他并未预装CamStudio解码器的机器正常播放。

合并。我尝试过许多种组合,国产流氓软件我们就不再提及。这里记录下使用FFmpeg的操作过程。来源于搜索到的这篇文章。它的一个思路就是将mp4用MPEG TS码流,而TS码流在文本数据层面可以进行拼接的动作。那么我这里还多了一步转换成mp4封装的步骤,vcode和acode就不指定了,FFmpeg的默认编码必然满足我的需要。

ffmpeg -i demo2-1.avi demo2-1.mp4
ffmpeg -i demo2-2.avi demo2-2.mp4
...
 
ffmpeg -i 1.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 1.ts
ffmpeg -i 2.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 2.ts
ffmpeg -i "concat:1.ts|2.ts" -acodec copy -vcodec copy -absf aac_adtstoasc output.mp4

后来嫌麻烦,写了个Batch做这个合并的事情。放心,FFmpeg跑的挺快的。我在Windows下干活,也可以根据需要转成shell脚本。


@echo off

ffmpeg -i %1 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 1.ts
ffmpeg -i %2 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 2.ts
ffmpeg -i "concat:1.ts|2.ts" -acodec copy -vcodec copy -absf aac_adtstoasc %3

del 1.ts
del 2.ts

最后呢,就是按照需要去裁剪那些因为不断失误而录下来的错误。参考了这篇和这篇文章。他们的一个思路都是利用ffmpeg -ss <Start time> -t <Duration>的选项去做裁剪输出。但是直接对H.264和AAC等编码的码流使用会有两大问题:1、视频裁剪只能对关键参考帧动刀子,如果需要裁切的时间落在了P帧或者B帧最后输出的视频片断肯定有偏差。2、比较明显的音画不同步问题。

那么为了解决上述问题,思路则为:针对问题1,首先将码流转换为仅帧内预测编码(Intra Prediction),另外将AAC等压缩的音频流还原成PCM也对问题2有帮助。参考文章之一选择了MJPEG作为“无损”的视频编码格式,并且提到不使用RAW的理由。而在我的实际使用步骤并不绝对符合。我使用h264的纯帧内编码和PCM音频。


ffmpeg -i demo3-1_1.avi -vcodec h264 -intra -acodec pcm_s16e demo3-1_out.avi


接下来,想要将一段25秒长的错误之处去掉。这里利用MPlayer播放暂停后使用Goto(Ctrl+G)得到比较精确的时间:2'59.121'' ~ 3'24.638''。那么用FFmpeg裁剪,就等价于截取0'0''~2'59.121''和3'24.638''这段,抛弃不要的,用上面讲的方法合并前后。为了计算Duration方便,我将分秒格式的时间(1:2.30)换算成秒钟浮点数(62.30)——这两种格式都被FFmpeg支持。


ffmpeg -ss 0.00 -t 179.121 -i demo3-1_out.avi -vcodec libx264 -acodec libvo_aacenc
-ab 320k demo3-1_1.mp4
ffmpeg -ss 204.638 -t 80.372 -i demo3-1a.avi -vcodec libx264 -acodec libvo_aace
nc -ab 320k demo3-1_2.mp4

join_mp4.bat demo3-1_1.mp4 demo3-1_2.mp4 demo3-1.mp4


好了,烦恼我一个月的视频编辑做完啦。