ffmpeg 这玩意挺混蛋的,对于大部分编码选时都精确不到秒(一般只能在 I-Frame 处分割)。于是,如果想要精确一些的话,还得做些额外的工作。
以下默认输入文件是 in.avi ,输出文件是 out.avi ,其余为临时文件。
- 首先先大致截取你要的那一段视频,注意在开头和结尾留大概 10 秒钟的余量。
~$ ffmpeg -ss [START_TIME – 10] -i in.avi -vcodec copy -acodec copy -t [DURATION + 20] pre.avi
另外再罗嗦一句,ffmpeg 支持的时间格式有 123.4 这样的秒钟格式和 0:00:05.6 这样的时间格式,两种格式都可以不带小数部分。
注意这个步骤万万不能省,余量也不能留得过大,否则当心执行步骤 3 的时候 ffmpeg 的 buffer 把你的内存干爆。 - 然后把视频转换成帧与帧之间不相关的编码,这样就不会受到只能在 I-Frame 处分割的限制了,同时为了保险起见音频部分也转成 PCM 。这里会用到 Motion JPEG 编码,之所以不用 rawvideo 倒不是因为文件体积太大了,而是因为无论是 ffmpeg 还是 mplayer/mencoder 在处理这货的时候都会出现严重的音画不同步。
~$ ffmpeg -i pre.avi -vcodec mjpeg -qscale 1 -acodec pcm_s16le pre.mov - 然后选段并且压制。注意这两步最好一起做,因为如果用 copy 的 a/vcodec 来做的话,很容易出现一些奇怪的现象。
~$ ffmpeg -i pre.mov -ss [START_TIME, about 10 secs] -pix_fmt yuv420p -vcodec libx264 -crf 23 -acodec libvo_aacenc -ab 128k -t [DURATION] out.avi - 完成后用 mplayer 确认一下,如果出现残疾或者没阉干净的现象就需要小心地调整时间上的参数,重复步骤 3 ,直到满意。
你可以在 mplayer 里面按住键盘上的“←”键来检视第一帧。最后别忘了删掉两个临时文件。
(END)
第三部有问题,无法执行
pre.mov: Invalid data found when processing input
抱歉,似乎命令漏掉了一点,已更正。
第二步运行出现pcm_s16le: Invalid argument 错误,不是不要添加依赖库
第三步依然是无法执行pre.mov: Invalid data found when processing input
第二步运行出现pcm_s16le: Invalid argument 错误,是不是要添加依赖库
第三步依然是无法执行pre.mov: Invalid data found when processing input
ffmpeg version N-71043-g641ef7d Copyright (c) 2000-2015 the FFmpeg developers
built with gcc 4.8 (Ubuntu 4.8.4-2ubuntu1~14.04.1)
configuration: –enable-libx264 –enable-gpl –disable-yasm
libavutil 54. 20.100 / 54. 20.100
libavcodec 56. 29.100 / 56. 29.100
libavformat 56. 26.101 / 56. 26.101
libavdevice 56. 4.100 / 56. 4.100
libavfilter 5. 13.101 / 5. 13.101
libswscale 3. 1.101 / 3. 1.101
libswresample 1. 1.100 / 1. 1.100
libpostproc 53. 3.100 / 53. 3.100
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x95539e0] Format mov,mp4,m4a,3gp,3g2,mj2 detected only with low score of 1, misdetection possible!
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x95539e0] moov atom not found
pre.mov: Invalid data found when processing input
这个问题怎么解决的?
第三部出现 unknown encoder ‘libvo_aacenc’ ,求赐教
现在的 ffmpeg 貌似不再使用 libvo 压制 AAC 了。可以把 libvo_aacenc 换成 aac 试试看。
楼主你好,第三步里 -vcodec libx264 编码器参数需不需要设置,不设置的话和原片相比是不是清晰度会有损失?
楼主你好,第三步里-vcodec libx264 需要设置编码器参数吗?如果不设置清晰度和原片相比是不是有损失?
为啥发的评论不显示,再发一遍
楼主你好,第三步里-vcodec libx264 需要设置编码器参数吗?如果不设置清晰度会不会有损失