【ffmpeg命令基础】流复制

文章目录


前言

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


为什么需要流复制

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

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

流复制的示意图

bash 复制代码
 _______              ______________            ________
|       |            |              |          |        |
| input |  demuxer   | encoded data |  muxer   | output |
| file  | ---------> | packets      | -------> | file   |
|_______|            |______________|          |________|

流复制的例子

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

bash 复制代码
ffmpeg -i input.mp4 -c copy output.mkv

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

bash 复制代码
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 参数,用户可以直接复制音视频流,避免了重新编码的过程。这不仅提高了处理速度,还保持了原始文件的质量。掌握流复制的使用方法,可以大大提升视频处理的效率和效果。

相关推荐
用户96715113916724 小时前
Rust 如何轻松实现 RTMP 流媒体推送?深入解析直播推流场景与解决方案
rust·ffmpeg
小小码农Come on4 小时前
ffmpeg命令整理
ffmpeg
暮云星影4 小时前
三、FFmpeg学习笔记
linux·ffmpeg
hyshhhh5 小时前
【算法岗面试题】深度学习中如何防止过拟合?
网络·人工智能·深度学习·神经网络·算法·计算机视觉
AndrewHZ6 小时前
【图像处理基石】什么是tone mapping?
图像处理·人工智能·算法·计算机视觉·hdr
jndingxin8 小时前
OpenCV 图形API(11)对图像进行掩码操作的函数mask()
人工智能·opencv·计算机视觉
阳光_你好8 小时前
请详细说明opencv/c++对图片缩放
c++·opencv·计算机视觉
契合qht53_shine9 小时前
OpenCV 从入门到精通(day_05)
人工智能·opencv·计算机视觉
逼子格9 小时前
五种音频器件综合对比——《器件手册--音频器件》
嵌入式硬件·音视频·硬件工程师·硬件测试·电子器件·硬件笔试真题·音频器件
芭拉拉小魔仙9 小时前
Uniapp Vue3 小程序接入实时音视频TUICallKit遇到的问题
小程序·uni-app·实时音视频