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