2024-03-02
温故知新
00
请注意,本文编写于 264 天前,最后修改于 121 天前,其中某些信息可能已经过时。

目录

简介
处理加速
CUDA加速
视频
视频裁剪
视频优化
MP4转M3U8
音频和视频合并
音频
视频分离音频
音频格式直接转换为wav
音频文件合并

简介

本文用于记录使用FFmpeg的记录,可当作笔记查阅。

处理加速

FFmpeg 在运行时主要使用 CPU 资源来进行视频解码、编码、转换和处理等操作。通常情况下,默认情况下 FFmpeg 不会直接利用 GPU 进行处理。但是,如果您的系统支持 GPU 加速,并且您的 FFmpeg 编译版本启用了相关的 GPU 加速选项,那么您可以通过设置相应的参数来利用 GPU 进行加速。

目前,FFmpeg 支持通过 CUDAOpenCLVDPAUVA-API等接口来利用GPU进行加速。具体支持的接口取决于您使用的FFmpeg版本以及所使用的硬件和驱动情况。

如果您想要使用GPU进行加速,可以在编译FFmpeg时启用相应的选项,然后通过命令行参数或者API调用来指定使用GPU进行加速。

CUDA加速

要在 FFmpeg 中使用 CUDA 开启 GPU 加速,您需要确保以下几点:

  • 安装 CUDA Toolkit:首先,您需要安装 NVIDIACUDA Toolkit,您可以从 NVIDIA 官方网站下载并安装适用于您操作系统版本的 CUDA Toolkit

  • 编译FFmpeg:在编译时您需要通过 --enable-cuda 参数启用CUDA支持。

PS:可与通过 ffmpeg -buildconf 命令查看你的 FFmpeg 编译配置,如果出现 --enable-cuda 相关配置,大都是支持 CUDA 加速的软件包。

  • 运行FFmpeg命令:一旦您编译并安装了 CUDA 支持的 FFmpeg ,您可以使用 CUDA 加速来执行相应的命令。在执行命令时,FFmpeg 会自动识别 CUDA 支持,并且尝试使用 GPU 进行加速处理。以下是一个示例命令,演示了如何使用 CUDA 加速进行视频转码:
bash
ffmpeg -i input.mp4 -c:v h264_nvenc -profile:v high -preset:v fast output.mp4

在这个示例中,使用了 h264_nvenc 编码器来利用 NVIDIACUDA 加速进行 H.264 视频编码。 -profile:v high-preset:v fast 分别指定了编码器的配置参数。您可以根据需要调整参数来达到更好的性能和质量。

视频

视频裁剪

bash
ffmpeg -i input.mp4 -vf "crop=640:480" output.mp4
  • -vf "crop=640:480": 将视频裁剪为640x480的分辨率。

视频优化

bash
ffmpeg -i input_low_quality.mp4 -c:v libx264 -b:v 2M -vf "scale=1280:720" -c:a aac -b:a 192k output_high_quality.mp4
  • -i input_low_quality.mp4:指定输入文件,这里是一个低质量的 MP4 视频文件。
  • -c:v libx264:选择视频编码器为 libx264,这是一个 H.264 编码器。
  • -b:v 2M:设置视频比特率为 2 Mbps。这决定了视频的压缩率,值越高,视频质量越好,但文件大小也越大。
  • -vf "scale=1280:720":使用视频滤镜进行缩放操作。这里将视频缩放到宽度为 1280 像素,高度为 720 像素。这可以用于改变视频的分辨率。
  • -c:a aac:选择音频编码器为 AAC。
  • -b:a 192k:设置音频比特率为 192 kbps。这决定了音频的压缩率,值越高,音频质量越好,但文件大小也越大。
  • output_high_quality.mp4:指定输出文件,这里是一个高质量的 MP4 视频文件。

MP4转M3U8

bash
ffmpeg -i input.mp4 -c:v libx264 -c:a aac -f hls -hls_time 10 -hls_list_size 0 -hls_segment_filename output%d.ts output.m3u8

这个命令将输入文件 input.mp4 转换为 HLS 格式,并生成一个名为 output.m3u8M3U8 播放列表文件和一系列的 .ts 切片文件。以下是对命令中参数的解释:

  • -i input.mp4:指定输入文件的路径。
  • -c:v libx264:指定视频编码器为libx264,用于视频编码。
  • -c:a aac:指定音频编码器为aac,用于音频编码。
  • -f hls:指定输出格式为HLS。
  • -hls_time 10:指定每个切片的时长,这里是10秒。
  • -hls_list_size 0:指定不限制播放列表的长度。
  • -hls_segment_filename output%d.ts:指定.ts切片文件的命名模板为output%d.ts,其中%d表示数字序号,FFmpeg会根据序号生成一系列的.ts切片文件
bash
# 使用GPU加速处理 ffmpeg -i input.mp4 -c:v h264_nvenc -b:v 10M -c:a aac -f hls -hls_time 10 -hls_list_size 0 -hls_segment_filename output%d.ts output.m3u8
  • -c:v h264_nvenc:指定视频编码器为 h264_nvenc,这是 NVIDIA GPU 加速的 H.264 编码器。使用这个编码器可以利用 NVIDIA GPU 进行视频编码,从而提高转码速度和效率。
  • -b:v 5M:指定视频的比特率为 5M,这是视频的目标比特率,用来控制视频的质量和文件大小。

PS: 当您在使用 FFmpeg 进行视频转码时,如果没有设置 -b:v 参数来指定视频的目标比特率,FFmpeg 会尽可能地保留原始视频的质量和数据。所以,一些简单操作时无需使用 -b:v 参数。

音频和视频合并

ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -c:a aac -strict experimental output.mp4

命令的解释:

  • -i video.mp4:指定输入视频文件。
  • -i audio.mp3:指定输入音频文件。
  • -c:v copy:表示视频流直接复制,不重新编码。
  • -c:a aac:表示音频流使用 AAC 编码。
  • -strict experimental:允许使用实验性的 AAC 编码。
  • output.mp4:输出的文件名。

其中音频文件可以是其他格式,如 audio.m4a 也是可以的。

音频

视频分离音频

bash
ffmpeg -i input.mp4 -vn -acodec copy output_audio.aac
  • -i input.mp4: 指定输入文件。
  • -vn: 禁用视频流。
  • -acodec copy: 表示使用原始音频编解码器进行拷贝。
  • output_audio.aac: 是输出音频文件的名称。

音频格式直接转换为wav

bash
ffmpeg -i input.mp4 -vn -acodec pcm_s16le -ar 44100 -ac 2 output_audio.wav
  • -i input.mp4:指定输入文件。
  • -vn:禁用视频流。
  • -acodec pcm_s16le:选择音频编码器为 pcm_s16le,这是一个无损的音频编码器。
  • -ar 44100:设置音频采样率为 44.1 kHz。你可以根据需要调整采样率。
  • -ac 2:设置音频通道数为 2(立体声)。
  • output_audio.wav:指定输出音频文件的名称。

音频文件合并

bash
ffmpeg -i input1.wav -i input2.wav -filter_complex "[0:0][1:0]concat=n=2:v=0:a=1[out]" -map "[out]" output.wav
  • input1.wav-i input2.wav:指定两个输入文件。
  • filter_complex "[0:0][1:0]concat=n=2:v=0:a=1[out]":使用 concat 滤镜将两个音频文件拼接在一起。n=2 表示有两个输入文件,v=0 表示没有视频流,a=1 表示有一个音频流。
  • map "[out]":指定输出流。
  • output.wav:输出的拼接后的文件。
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:DingDangDog

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!