【ffmpeg命令基础】流复制


前言

在视频处理领域,FFmpeg 是一个功能强大且广泛使用的工具。它可以处理几乎所有类型的多媒体文件,并支持多种操作,如转码、剪辑、合并等。本文将介绍 FFmpeg 中的一个重要功能——流复制。流复制是一种高效的处理方式,可以在不重新编码的情况下直接复制音视频流,从而节省时间和计算资源。


为什么需要流复制

在FFmpeg中,"流复制"是一种特殊的转码方式。通常,当我们使用FFmpeg转换视频或音频时,它会解码输入流,然后再编码为输出格式。这个过程可能会导致一些质量损失,并且需要一定的计算资源。

然而,如果输入和输出格式相同,我们其实并不需要进行解码和重新编码。这时,我们可以使用"流复制"。"流复制"就是直接将输入流复制到输出,不进行任何的解码和编码操作。这样可以节省大量的计算资源,并且不会有任何质量损失。

流复制的示意图

 _______              ______________            ________
|       |            |              |          |        |
| input |  demuxer   | encoded data |  muxer   | output |
| file  | ---------> | packets      | -------> | file   |
|_______|            |______________|          |________|

流复制的例子

举个例子,如果你想将一个mp4格式的视频转换为mkv格式,而视频流和音频流的编码方式都是你需要的,那么你可以使用"流复制"。命令可能是这样的:

ffmpeg -i input.mp4 -c copy output.mkv

在这个命令中,-c copy就是告诉FFmpeg使用"流复制"。这意味着视频和音频流会被直接复制到输出文件,而不会进行解码和重新编码。

D:\Codes\ffmpeg_Command>ffmpeg -i test2.mp4 -c copy out6.mkv
ffmpeg version 7.0.1-essentials_build-www.gyan.dev Copyright (c) 2000-2024 the FFmpeg developers
  built with gcc 13.2.0 (Rev5, Built by MSYS2 project)
  configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-zlib --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-sdl2 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-libfreetype --enable-libfribidi --enable-libharfbuzz --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-dxva2 --enable-d3d11va --enable-d3d12va --enable-ffnvcodec --enable-libvpl --enable-nvdec --enable-nvenc --enable-vaapi --enable-libgme --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libtheora --enable-libvo-amrwbenc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-librubberband
  libavutil      59.  8.100 / 59.  8.100
  libavcodec     61.  3.100 / 61.  3.100
  libavformat    61.  1.100 / 61.  1.100
  libavdevice    61.  1.100 / 61.  1.100
  libavfilter    10.  1.100 / 10.  1.100
  libswscale      8.  1.100 /  8.  1.100
  libswresample   5.  1.100 /  5.  1.100
  libpostproc    58.  1.100 / 58.  1.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test2.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf61.1.100
    description     : Packed by Bilibili XCoder v2.0.2
  Duration: 00:00:30.07, start: 0.000000, bitrate: 3275 kb/s
  Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 3124 kb/s, 60 fps, 60 tbr, 16k tbn (default)
      Metadata:
        handler_name    : Bento4 Video Handler
        vendor_id       : [0][0][0][0]
  Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 135 kb/s (default)
      Metadata:
        handler_name    : Bento4 Sound Handler
        vendor_id       : [0][0][0][0]
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
Output #0, matroska, to 'out6.mkv':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    description     : Packed by Bilibili XCoder v2.0.2
    encoder         : Lavf61.1.100
  Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 3124 kb/s, 60 fps, 60 tbr, 1k tbn (default)
      Metadata:
        handler_name    : Bento4 Video Handler
        vendor_id       : [0][0][0][0]
  Stream #0:1(und): Audio: aac (LC) ([255][0][0][0] / 0x00FF), 44100 Hz, stereo, fltp, 135 kb/s (default)
      Metadata:
        handler_name    : Bento4 Sound Handler
        vendor_id       : [0][0][0][0]
Press [q] to stop, [?] for help
[out#0/matroska @ 0000020f98863900] video:11467KiB audio:495KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: 0.187817%
size=   11985KiB time=00:00:29.99 bitrate=3272.8kbits/s speed=1.2e+03x

用时非常的短,基本就是秒完成的


总结

流复制是 FFmpeg 中一个非常实用的功能,特别适用于需要快速处理视频文件而不损失质量的场景。通过使用 -c copy 参数,用户可以直接复制音视频流,避免了重新编码的过程。这不仅提高了处理速度,还保持了原始文件的质量。掌握流复制的使用方法,可以大大提升视频处理的效率和效果。

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

人才程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值