ffmpeg使用总结
1 获取
安装
pip install ffmpeg
查看版本
ffmpeg --version
查看帮助选项 for basic options
ffmpeg -h
查看选项 for more options
ffmpeg -h long
2 用法
1、将一个老式的avi文件转成mp4
ffmpeg -i final.avi -acodec copy -vcodec copy final.mp4
2、从一个视频文件中抽取一帧图像:
ffmpeg -y -i test.mp4 -ss 00:03:22.000 -vframes 1 -an test.jpg
3、调整分辨率
ffmpeg -i final.avi -vf scale=640:640 square.avi
4、使用alsa接口录制一段音频存放到某个wav文件中
ffmpeg -f alsa -i hw:0 -t 100 alsaout.wav
5、从"video.mp4"中每秒抽取2帧图像到"./ffmpeg/"路径下
ffmpeg -i "video.mp4" -vf fps=2 "ffmpeg/%05d.jpg"
6、将“video.mp4”按照其帧率逐帧分解为jpg图像并存储到"./ffmpeg/"路径下
ffmpeg -i "video.mp4" "ffmpeg/%05d.jpg"
7、将“video.mp4”按照其帧率fps=25逐帧提取图像并存储到"./ffmpeg/"路径下,fps=25的视频也可以将按照fps=30进行提取相应的图像数量
ffmpeg -i "video.mp4" -r 25 -q:v 1 "./ffmpeg/output_%06d.jpg"
3 视频数据集预处理脚本
3.1 UCF101
做视频的工作,数据预处理相对会比较复杂,由于视频数据集通常较大,我们通常将其先转为图片的形式,再每次从硬盘上读一个batch的数据。下载UCF101数据集之后,将其解压到项目的根目录下。创建convert_video_to_images.sh文件,内容为
for folder in $1/*
do
for file in "$folder"/*.avi
do
if [[ ! -d "${file[@]%.avi}" ]]; then
mkdir -p "${file[@]%.avi}"
fi
ffmpeg -i "$file" -vf fps=$2 "${file[@]%.avi}"/%05d.jpg
rm "$file"
done
done
执行
sudo ./convert_video_to_images.sh UCF101/ 5
表示将视频每秒取5帧图片。
3.2 AVA2.2
1.download videos
DATA_DIR="../../data/ava/videos"
if [[ ! -d "${DATA_DIR}" ]]; then
echo "${DATA_DIR} doesn't exist. Creating it.";
mkdir -p ${DATA_DIR}
fi
wget https://s3.amazonaws.com/ava-dataset/annotations/ava_file_names_trainval_v2.1.txt
for line in $(cat ava_file_names_trainval_v2.1.txt)
do
wget https://s3.amazonaws.com/ava-dataset/trainval/$line -P ${DATA_DIR}
done
2.Cut each video from its 15th to 30th minute
IN_DATA_DIR="../../data/ava/videos"
OUT_DATA_DIR="../../data/ava/videos_15min"
if [[ ! -d "${OUT_DATA_DIR}" ]]; then
echo "${OUT_DATA_DIR} doesn't exist. Creating it.";
mkdir -p ${OUT_DATA_DIR}
fi
for video in $(ls -A1 -U ${IN_DATA_DIR}/*)
do
out_name="${OUT_DATA_DIR}/${video##*/}"
if [ ! -f "${out_name}" ]; then
ffmpeg -ss 900 -t 901 -i "${video}" "${out_name}"
fi
done
3.Extract frames
IN_DATA_DIR="../../data/ava/videos_15min"
OUT_DATA_DIR="../../data/ava/frames"
if [[ ! -d "${OUT_DATA_DIR}" ]]; then
echo "${OUT_DATA_DIR} doesn't exist. Creating it.";
mkdir -p ${OUT_DATA_DIR}
fi
for video in $(ls -A1 -U ${IN_DATA_DIR}/*)
do
video_name=${video##*/}
if [[ $video_name = *".webm" ]]; then
video_name=${video_name::-5}
else
video_name=${video_name::-4}
fi
out_video_dir=${OUT_DATA_DIR}/${video_name}/
mkdir -p "${out_video_dir}"
out_name="${out_video_dir}/${video_name}_%06d.jpg"
ffmpeg -i "${video}" -r 30 -q:v 1 "${out_name}"
done
4.Download annotations
DATA_DIR="../../data/ava/annotations"
if [[ ! -d "${DATA_DIR}" ]]; then
echo "${DATA_DIR} doesn't exist. Creating it.";
mkdir -p ${DATA_DIR}
fi
wget https://research.google.com/ava/download/ava_train_v2.1.csv -P ${DATA_DIR}
wget https://research.google.com/ava/download/ava_val_v2.1.csv -P ${DATA_DIR}
wget https://research.google.com/ava/download/ava_action_list_v2.1_for_activitynet_2018.pbtxt -P ${DATA_DIR}
wget https://research.google.com/ava/download/ava_train_excluded_timestamps_v2.1.csv -P ${DATA_DIR}
wget https://research.google.com/ava/download/ava_val_excluded_timestamps_v2.1.csv -P ${DATA_DIR}
5.Download “frame lists” (train, val) and put them in the frame_lists
folder (see structure above).
6.Download person boxes (train, val, test) and put them in the annotations
folder (see structure above). If you prefer to use your own person detector, please see details in here.