用 ffmpeg 实现视频精确分段

ffmpeg 这玩意挺混蛋的,对于大部分编码选时都精确不到秒(一般只能在 I-Frame 处分割)。于是,如果想要精确一些的话,还得做些额外的工作。

以下默认输入文件是 in.avi ,输出文件是 out.avi ,其余为临时文件。

  1. 首先先大致截取你要的那一段视频,注意在开头和结尾留大概 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 把你的内存干爆。
  2. 然后把视频转换成帧与帧之间不相关的编码,这样就不会受到只能在 I-Frame 处分割的限制了,同时为了保险起见音频部分也转成 PCM 。这里会用到 Motion JPEG 编码,之所以不用 rawvideo 倒不是因为文件体积太大了,而是因为无论是 ffmpeg 还是 mplayer/mencoder 在处理这货的时候都会出现严重的音画不同步。
    ~$ ffmpeg -i pre.avi -vcodec mjpeg -qscale 1 -acodec pcm_s16le pre.mov
  3. 然后选段并且压制。注意这两步最好一起做,因为如果用 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
  4. 完成后用 mplayer 确认一下,如果出现残疾或者没阉干净的现象就需要小心地调整时间上的参数,重复步骤 3 ,直到满意。
    你可以在 mplayer 里面按住键盘上的“←”键来检视第一帧。最后别忘了删掉两个临时文件。

(END)

《用 ffmpeg 实现视频精确分段》上的11个想法

      1. 第二步运行出现pcm_s16le: Invalid argument 错误,不是不要添加依赖库
        第三步依然是无法执行pre.mov: Invalid data found when processing input

      2. 第二步运行出现pcm_s16le: Invalid argument 错误,是不是要添加依赖库
        第三步依然是无法执行pre.mov: Invalid data found when processing input

  1. 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

  2. 楼主你好,第三步里 -vcodec libx264 编码器参数需不需要设置,不设置的话和原片相比是不是清晰度会有损失?

  3. 楼主你好,第三步里-vcodec libx264 需要设置编码器参数吗?如果不设置清晰度和原片相比是不是有损失?

  4. 为啥发的评论不显示,再发一遍
    楼主你好,第三步里-vcodec libx264 需要设置编码器参数吗?如果不设置清晰度会不会有损失

回复 shuizuifeng 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据