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

相关推荐
Eric.Lee20211 小时前
Paddle OCR 中英文检测识别 - python 实现
人工智能·opencv·计算机视觉·ocr检测
audyxiao0012 小时前
AI一周重要会议和活动概览
人工智能·计算机视觉·数据挖掘·多模态
mo47763 小时前
Webrtc音频模块(四) 音频采集
音视频·webrtc
icy、泡芙3 小时前
T527-----音频调试
linux·驱动开发·音视频
易我数据恢复大师3 小时前
怎么提取音频保存到本地?电脑音频提取方法
音视频·软件·音频提取
野蛮的大西瓜3 小时前
开源呼叫中心中,如何将ASR与IVR菜单结合,实现动态的IVR交互
人工智能·机器人·自动化·音视频·信息与通信
橙子小哥的代码世界4 小时前
【计算机视觉基础CV-图像分类】01- 从历史源头到深度时代:一文读懂计算机视觉的进化脉络、核心任务与产业蓝图
人工智能·计算机视觉
小陈phd5 小时前
OpenCV学习——图像融合
opencv·计算机视觉·cv
嘟嘟实验室6 小时前
微信小程序xr-frame透明视频实现
微信小程序·ffmpeg·音视频·xr
是十一月末6 小时前
Opencv之对图片的处理和运算
人工智能·python·opencv·计算机视觉