SPYOFF VPN

2017-07-10


在学习这一节内容之前,请确保已经学习了上一节内容 初识 FFmpeg

上一节我们下载了一个韩国小姐姐的直播视频,其中包含很多 ts 文件。 我们可以单独播放每一个 ts 文件,也可以把这个视频转换为 mp4 格式封装的视频。

  • FFmpeg m3u8 to mp4

    转换为 out.mp4

    ffmpeg -i index.m3u8 out.mp4
    

    转换成功,当前目录已经输出 out.mp4

    查看 out.mp4 的信息:

    ffmpeg -i out.mp4
    

    信息输出:

    Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'out.mp4':
      Metadata:
        major_brand     : isom
        minor_version   : 512
        compatible_brands: isomiso2avc1mp41
        encoder         : Lavf57.71.100
      Duration: 00:01:00.10, start: 0.000000, bitrate: 558 kb/s
        Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 800x600 [SAR 1:1 DAR 4:3], 423 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc (default)
        Metadata:
          handler_name    : VideoHandler
        Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
        Metadata:
          handler_name    : SoundHandler
    

    自己手动练习一下,将 out.mp4 转换为 out.m3u8,注意一下 -hls_list_size 0 哦。

  • FFmpeg mp4 to mp3

    FFmpeg 可以将 mp4 视频里面的音频文件抽取出来,下面的命令将 out.mp4 的音频文件抽取成 audio.mp3

    ffmpeg -i out.mp4 -vn audio.mp3
    

    文件输出成功,查看 audio.mp3 的信息:

    ffmpeg -i audio.mp3
    

    信息输出:

    Input #0, mp3, from 'audio.mp3':
      Metadata:
        major_brand     : isom
        minor_version   : 512
        compatible_brands: isomiso2avc1mp41
        encoder         : Lavf57.71.100
      Duration: 00:01:00.08, start: 0.025057, bitrate: 128 kb/s
        Stream #0:0: Audio: mp3, 44100 Hz, stereo, s16p, 128 kb/s
        Metadata:
          encoder         : Lavc57.89
    

    audio.mp3 只包含 Stream #0:0: Audio: mp3

    点击 audio.mp3 试听,是不是直播视频里面小姐姐的声音?

    上面命令中的 -vn 表示禁用 video,其中 v 就是代表 video

    相应地也有 -an 的选项表示禁用 audioa 代表 audio,测试一下:

    ffmpeg -i out.mp4 -an video.mp4
    

    video.mp4 输出成功,查看其信息:

    ffmpeg -i video.mp4
    

    信息输出:

    Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'video.mp4':
      Metadata:
        major_brand     : isom
        minor_version   : 512
        compatible_brands: isomiso2avc1mp41
        encoder         : Lavf57.71.100
      Duration: 00:01:00.10, start: 0.000000, bitrate: 411 kb/s
        Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 800x600 [SAR 1:1 DAR 4:3], 409 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc (default)
        Metadata:
          handler_name    : VideoHandler
    

    video.mp4 只包含 Stream #0:0(und): Video: h264

    点击 video.mp4 试看,视频去掉了 声音 部分。

  • FFmpeg merge video and audio

    我们得到了一个 audio.mp3video.mp4,其中前者只包含 音频,后者只包含 视频。 那么我们是否可以将两者合并成一个,同时包含 音频视频

    请看这一条命令:

    ffmpeg -i video.mp4 -i audio.mp3 merge.mp4
    

    点击 merge.mp4 观看,音频视频 已经合并在一起了。

    如上命令,-i 可以接收多个输入文件。

    可以查看其信息:

    ffmpeg -i merge.mp4
    

    信息输出:

    Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'merge.mp4':
      Metadata:
        major_brand     : isom
        minor_version   : 512
        compatible_brands: isomiso2avc1mp41
        encoder         : Lavf57.71.100
      Duration: 00:01:00.10, start: 0.000000, bitrate: 530 kb/s
        Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 800x600 [SAR 1:1 DAR 4:3], 395 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc (default)
        Metadata:
          handler_name    : VideoHandler
        Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
        Metadata:
          handler_name    : SoundHandler
    

    现在手动试着将 audio.mp3video.mp4 合并成 merge.mkvmerge.flv

  • FFmpeg filters

    查看 out.mp4 信息:

    ffmpeg -i out.mp4
    

    其中输出:

    Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'out.mp4':
      Metadata:
        major_brand     : isom
        minor_version   : 512
        compatible_brands: isomiso2avc1mp41
        encoder         : Lavf57.71.100
      Duration: 00:01:00.10, start: 0.000000, bitrate: 558 kb/s
        Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 800x600 [SAR 1:1 DAR 4:3], 423 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc (default)
        Metadata:
          handler_name    : VideoHandler
        Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
        Metadata:
          handler_name    : SoundHandler
    

    Duration: 00:01:00.10 这一段代表视频时长 一分钟。

    现在我们试着截取视频的 前 50s,

    ffmpeg -i out.mp4 -t 50 50s.mp4 
    

    等待一小段时间,50s.mp4 成功输出。

    查看其信息:

    ffmpeg -i 50s.mp4
    

    信息输出:

    Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '50s.mp4':
      Metadata:
        major_brand     : isom
        minor_version   : 512
        compatible_brands: isomiso2avc1mp41
        encoder         : Lavf57.71.100
      Duration: 00:00:50.02, start: 0.000000, bitrate: 539 kb/s
        Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 800x600 [SAR 1:1 DAR 4:3], 405 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc (default)
        Metadata:
          handler_name    : VideoHandler
        Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 127 kb/s (default)
        Metadata:
          handler_name    : SoundHandler
    

    也可以截取从 第10s 开始的 50s 内容:

    ffmpeg -i out.mp4 -ss 10 -t 50 10to50.mp4
    

    还有一种更快的截取方法:

    ffmpeg -i out.mp4 -ss 10 -t 50 -c copy 10to50.mp4
    

    这条命令几乎瞬间完成。

    解释一下命令的各个输入选项:

    • -ss 表示截取开始的时间点
    • -t 表示截取的时长
    • -c copy 表示不进行视频的编解码,所以转换速度非常快。 其中 ccodec-c copy-c:v copy -c:a copy 的简写。


    再回头看看 out.mp4 的信息,其中包含 800x600 [SAR 1:1 DAR 4:3]800x600 就是视频的宽高。

    FFmpeg 可以指定输出视频的宽高:

    ffmpeg -i out.mp4 -s 400x300 400x300.mp4
    

    其中 ssize

    查看 400x300.mp4 信息:

    ffmpeg -i 400x300.mp4
    

    输出:

    Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '400x300.mp4':
      Metadata:
        major_brand     : isom
        minor_version   : 512
        compatible_brands: isomiso2avc1mp41
        encoder         : Lavf57.71.100
      Duration: 00:01:00.06, start: 0.000000, bitrate: 289 kb/s
        Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 400x300 [SAR 1:1 DAR 4:3], 155 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc (default)
        Metadata:
          handler_name    : VideoHandler
        Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 127 kb/s (default)
        Metadata:
          handler_name    : SoundHandler
    

    看到 400x300 了吧?

    也可以使用 -vf 选项:

    ffmpeg -i out.mp4 -vf scale=400x300 -y 400x300.mp4
    

    其中 -vf 代表 video filter

    需要注意的是,这里对视频的宽高进行了裁剪,所以 -c copy 不适用了。 不过,-c:a copy 还是可以使用的:

    ffmpeg -i out.mp4 -vf scale=400x300 -y -c:a copy 400x300.mp4
    

    FFmpeg 还可以对视频按宽高比例进行缩放:

    ffmpeg -i out.mp4 -vf scale=iw/2:-1 -c:a copy scale.mp4
    

    其中 iwinput width-1 指相应比例缩放,当然也有相应的 ih 选项。

    查看 scale.mp4 信息:

    ffmpeg -i scale.mp4
    

    信息输出:

    Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'scale.mp4':
      Metadata:
        major_brand     : isom
        minor_version   : 512
        compatible_brands: isomiso2avc1mp41
        encoder         : Lavf57.71.100
      Duration: 00:01:00.06, start: 0.000000, bitrate: 289 kb/s
        Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 400x300 [SAR 1:1 DAR 4:3], 155 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc (default)
        Metadata:
          handler_name    : VideoHandler
        Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
        Metadata:
          handler_name    : SoundHandler
    

    FFmpeg 还可以通过设置 presentation timestamp (PTS) 处理视频 快放慢放

    快放:

    ffmpeg -i out.mp4 -vf setpts=0.5*PTS speedup.mp4
    

    慢放:

    ffmpeg -i out.mp4 -vf setpts=2.0*PTS slowdown.mp4
    

    分别打开 speedup.mp4slowdown.mp4 观看,你会发现一个怪异的问题:

    只有图像的快放和慢放,音频没有变化,即 音画不同步

    通过 atempo 可以指定 音频 的快放和慢放:

    ffmpeg -i out.mp4 -af atempo=2.0 -y speedup.mp4
    
    ffmpeg -i out.mp4 -af atempo=0.5 -y slowdown.mp4
    

    如何处理 音画不同步 问题?

    ffmpeg -i out.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" -y speedup.mp4
    
    ffmpeg -i out.mp4 -filter_complex "[0:v]setpts=2.0*PTS[v];[0:a]atempo=0.5[a]" -map "[v]" -map "[a]" -y slowdown.mp4
    

    下一节将会介绍 FFmpeg 处理图片问题。



温馨提醒

为了获得更好的阅读体验,您应该使用 Chrome 浏览器访问本站!


联系站长

Email: hi@zengzhihao.pw



VULTR