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

相关推荐
runing_an_min1 小时前
ffmpeg视频滤镜:提取缩略图-framestep
ffmpeg·音视频·framestep
HPC_fac130520678162 小时前
以科学计算为切入点:剖析英伟达服务器过热难题
服务器·人工智能·深度学习·机器学习·计算机视觉·数据挖掘·gpu算力
小曲曲2 小时前
接口上传视频和oss直传视频到阿里云组件
javascript·阿里云·音视频
安静读书4 小时前
Python解析视频FPS(帧率)、分辨率信息
python·opencv·音视频
小陈phd4 小时前
OpenCV从入门到精通实战(九)——基于dlib的疲劳监测 ear计算
人工智能·opencv·计算机视觉
佑华硬盘拷贝机4 小时前
音频档案批量拷贝:专业SD拷贝机解决方案
音视频
EasyNVR4 小时前
NVR管理平台EasyNVR多个NVR同时管理:全方位安防监控视频融合云平台方案
安全·音视频·监控·视频监控
如若1239 小时前
主要用于图像的颜色提取、替换以及区域修改
人工智能·opencv·计算机视觉
加密新世界11 小时前
优化 Solana 程序
人工智能·算法·计算机视觉
hunteritself11 小时前
ChatGPT高级语音模式正在向Web网页端推出!
人工智能·gpt·chatgpt·openai·语音识别