前言
提示:这里可以添加本文要记录的大概内容:
目前深度学习cv比较火热的方向图像分类、目标检测、图像分割、图像检索等任务对于数据的多样性是非常渴望的,很多时候做项目的时候,在测试集上表现非常好,但是一部署到现场就翻车,因此数据的多样性很重要,但是对于视频的编码同样是有影响的,那今天就教大家通过ffmpeg转成不同编码的图像,让模型去学习,让模型泛化能力更强。
提示:本篇文章只讲述转换输出视频
一、FFmpeg是什么?
1.概述
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。
2.编解码基础知识
(1)封装格式
所谓封装格式是指音视频的组合格式,例如最常见的封装格式有mp4、mp3、flv等。简单来说,我们平时接触到的带有后缀的音视频文件都是一种封装格式。
(2)编码格式
以mp4为例,通常应该包含有视频和音频。视频的编码格式为YUV420P,音频的编码格式为PCM。再以YUV420编码格式为例。我们知道通常图像的显示为RGB(红绿蓝三原色),在视频压缩的时候会首先将代表每一帧画面的RGB压缩为YUV,再按照关键帧(I帧),过渡帧(P帧或B帧)进行运算和编码。解码的过程正好相反,解码器会读到I帧,并根据I帧运算和解码P帧以及B帧。并最终根据视频文件预设的FPS还原每一帧画面的RGB数据。最后推送给显卡。所以通常我们说的编码过程就包括:画面采集、转码、编码再封装。
(3)视频解码和音频解码有什么区别
FPS是图像领域中的定义,是指画面每秒传输帧数,通俗来讲就是指动画或视频的画面数。FPS太低画面会感觉闪烁不够连贯,FPS越高需要显卡性能越好。一些高速摄像机的采集速度能够达到11000帧/秒,那么在播放这类影片的时候我们是否也需要以11000帧/秒播放呢?当然不是,通常我们会按照25帧/秒或者60帧/秒设定图像的FPS值。但是由于视频存在关键帧和过渡帧的区别,关键帧保存了完整的画面而过渡帧只是保存了与前一帧画面的变化部分,需要通过关键帧计算获得。因此我们需要对每一帧都进行解码,即获取画面的YUV数据。同时只对我们真正需要显示的画面进行转码,即将YUV数据转换成RGB数据,包括计算画面的宽高等。
二、使用步骤
1.linux安装ffmpeg
教程链接:https://blog.csdn.net/u013314786/article/details/89682800
2.输出视频
video_convert.sh如下(示例):
#!/bin/bash
set -e
set -x
# 指定输入和输出目录
input_parent_dir="input_videos/"
output_parent_dir="output_videos"
## 指定视频编码器和音频编码器
#video_codec="libx264"
#audio_codec="aac"
#
## 指定视频分辨率
#resolution="1280x720"
#
## 指定视频比特率和音频比特率
#video_bitrate="2000k"
#audio_bitrate="128k"
# 遍历输入目录中的所有子目录
for input_dir in "$input_parent_dir"/*/
do
# 获取输入目录名
input_dirname=$(basename "$input_dir")
# 创建对应的输出目录
output_dir="$output_parent_dir/$input_dirname"
mkdir -p "$output_dir"
# 遍历当前输入目录中的所有视频文件
for input_file in "$input_dir"/*
do
# 获取输入文件名和扩展名
input_filename=$(basename "$input_file")
extension="${input_filename##*.}"
# 仅处理扩展名为.mp4的视频文件
if [[ "$extension" == "mp4" ]]
then
# 构建输出文件路径
#output_filename="${input_filename%.*}_encoded.mp4"
#output_file="$output_dir/$output_filename"
#-c:v 编码器 -preset slower
ffmpeg -i ${input_file} -c:v libx265 -preset slower -crf 28 -vtag hvc1 -y ${output_dir}/${input_filename%.mp4*}-h265-slower-crf_28.mp4
ffmpeg -i ${input_file} -c:v libx265 -preset medium -crf 28 -vtag hvc1 -y ${output_dir}/${input_filename%.mp4*}-h265-medium-crf_28.mp4
ffmpeg -i ${input_file} -c:v libx265 -preset ultrafast -crf 28 -vtag hvc1 -y ${output_dir}/${input_filename%.mp4*}-h265-ultrafast-crf_28.mp4
ffmpeg -i ${input_file} -c:v libx264 -b:v 100K -y ${output_dir}/${input_filename%.mp4*}-h264-bv_100k.mp4
ffmpeg -i ${input_file} -c:v libx264 -b:v 800K -y ${output_dir}/${input_filename%.mp4*}-h264-bv_800k.mp4
ffmpeg -i ${input_file} -c:v libx264 -b:v 5M -y ${output_dir}/${input_filename%.mp4*}-h264-bv_5M.mp4
ffmpeg -i ${input_file} -y ${output_dir}/${input_filename%.mp4*}.avi
fi
done
done
bash video_convert.sh #运行sh文件
3.视频常用参数
-c:指定编码器
-c copy:直接复制,不经过重新编码(这样比较快)
-c:v:指定视频编码器
-c:a:指定音频编码器
-i:指定输入文件
-an:去除音频流
-preset:指定输出的视频质量,会影响文件的生成速度,有以下几个可用的值 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow。
-y:不经过确认,输出时直接覆盖同名文件。
-crf 输出帧率
-vframes 设置要输出的视频帧数
-b 设定视频码率
-b:v 视频码率
-r 设定帧速率
-s 设定画面的宽与高
-vn 不处理视频
-aspect aspect 设置横纵比 4:3 16:9 或 1.3333 1.7777
-vcodec 设定视频编解码器,如果用copy表示原始编解码数据必须被拷贝。
-vf 视频过滤器
4.视频其他参数
-bitexact:使用标准比特率。
-vb:指定视频比特率(bit/s)
-croptop size:设置顶部切除尺寸(in pixels)
-cropleft size:设置左切除尺寸(in pixels)
-cropbottom size:设置地步切除尺寸(in pixels)
-cropright size:设置右切除尺寸(in pixels)
-padtop size:设置顶部补齐尺寸(in pixels)
-padleft size:设置左补齐尺寸(in pixels)
-padbottom size:设置地步补齐尺寸(in pixels)
-padright size:设置右补齐尺寸(in pixels)
-padcolor color:设置补齐颜色
案例分享
参考链接:FFmpeg详解及常用命令使用 - 知乎
原文链接:ffmpeg批量视频不同编码的输出_ffmpeg 输出多个视频文件_YAYA视觉的博客-CSDN博客
★文末名片可以免费领取音视频开发学习资料,内容包括(FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。
见下方!↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓