ffmpeg学习

新开一个坑,用ffmpeg工具进行一些视频的处理,和做一个新的数据集差不多的想法。这一类做法相当于是AE,PR这种的基层工具,学习一下也是一个不错的做法。
安装过程
一些用到的命令会写在下面以备使用。
现在根据原有的一些脚本加以改造后可以做到现在这么两个功能:具体的代码贴到下面:
1.首先是做标签然后把这一个类别的视频全部放入到对应类别的txt文件下:

#!/bin/bash

COUNT=-1
for folder in $1/*
do
    for imagesFolder in "$folder"/*
    do
        echo 'file '"$imagesFolder">> "$folder"-train.txt
    done
done

上面功能完成后可以的到讲标签做好符合ffmpeg用于处理合成一个类别的所有视频的功能。比如这个脚本我定义成2.sh,使用时bash 2.sh UCF101就可以直接给UCF101做好标签了,下面的脚本也是同理,只不过下面只遍历txt文件罢了。
2.将一个类别的视频合成为一个视频:

#bin/bash
for file in $1/*
do 
     COUNT=$[$COUNT + 1]
     ffmpeg -f concat -i $file -c copy output_$COUNT.mp4
done

这个实际上是对ucf101进行适配的,这一次转成MP4的格式。
现在目前仍存在的问题是没解决读取每个视频的帧率不同的问题,然后将其摘除或者说直接转到同一帧率的做法。下面需要解决的问题有两点:
1.拼接长视频之前对各个子视频的帧率,起始时间和结束时间做一次保留,这个一块还没有处理,可以参考kinetics是如何处理的(用于下载时的那个脚本有一些参考价值)
2.对于不同帧率的子视频,要是按现在统一转成25帧的策略来处理,需要看原来帧率不一样的视频是不是长短有变化,影响取帧的时候标签不一致。(实际上也可以直接先把所有视频帧率都转成一样的,这样的话倒是不用担心帧率不同的问题。)
这里转到MP4用的这个格式也是说用了H.26T4来改善,H.264有四种画质级别,分别是baseline, extended, main, high:
  1、Baseline Profile:基本画质。支持I/P 帧,只支持无交错(Progressive)和CAVLC;
  2、Extended profile:进阶画质。支持I/P/B/SP/SI 帧,只支持无交错(Progressive)和CAVLC;(用的少)
  3、Main profile:主流画质。提供I/P/B 帧,支持无交错(Progressive)和交错(Interlaced),
    也支持CAVLC 和CABAC 的支持;
  4、High profile:高级画质。在main Profile 的基础上增加了8x8内部预测、自定义量化、 无损视频编码和更多的YUV 格式。
这里对上面组合视频的地方有一点问题,因为写的是绝对路径所以导致如果找寻的文件夹下没有在所指定的文件夹下,也会报找不到文件的错误,需要把整个处理好的ucf101数据集再放到这个标号list的文件夹下,这样做的挺粗糙的,后续会更改。然后在读取list的时候在最后95-96的时候会不再加count上的数值,猜测是因为文件夹下加了这个ucf101的大文件夹在下方读不到,所以出问题,暂时手动更正了后面几个错位的文件名。
今天提到了一个之前没注意的细节,xiaolongwang给的kinetics数据集命名和官方下载的有一些区别,不过这里重新更改文件名也不是什么难题,这一块确实是没仔细检查,后续这块考试结束后和师兄继续讨论完善。(讲真复习的头很大,快烦了,然而又担心挂科不得不看。然而没有想到还是....十分之矛盾)

2019.2.28

2月底我们的工作遇到一个坎,需要把帧再拼接回视频,这里就体现了我自己确实不会ffmpeg,最后一条关键的命令是靠师兄给提供的。(师兄老是这么照顾我,除了感谢我实在想不出来别的词了..)
下面贴一下帧拼接视频的脚本,适用于做数据集中的多个视频。

#!/bin/bash
a=0
for folder in $1/*
do
    a=$(($a+1))
    for file in "$folder"/*.jpg
    do
        ffmpeg  -r 25 -i $folder/image_%5d.jpg -vcodec  mpeg4 compose/$a.mp4        
        break
    done
done

这里我们用的ffmpeg直接拼接图片,但是这里的问题是必须精确到jpg的命名才可以,当然这个做法有利有弊,利是图片格式都有个明确了解,可以统一处理成image_%5d.jpg的格式,如果后期发现了什么新方法会继续更新。统一mp4文件放到compose文件夹下。
然后配合下面的可以在原始的文件夹下面直接复制一份原始图像:

import cv2
import os
import matplotlib.pyplot as plt
load_path='folder'
x=os.walk(load_path)
i=800
for root,dirs,filename in x:
     for s in filename: 
      image=plt.imread(root+'/'+s)
      plt.imsave(root+'/'+s[:-7]+'{}.jpg'.format(i),image)
      i=i+1

这里还是有弊端,因为i=800实际上还是没有解决无限帧的情况或者有重名情况,但是这里因为看了一下something2something数据集实际上每一个视频都很短,不会超过100帧。不过安全起见还是设置了一个阈值到800.如果后面解决了这个问题也可以继续补充。
这个链接给的做法很给力,这个库还是记着些比较好用的。AE,PR 这些估计也是用这些底层的东西进行实现。
上面用os遍历文件夹,walk走完整个load_path,这里三级文件filename存的是我们二级文件夹下所有的文件,是个list类型,这样再从里面走一遍出来就可以得到对应的文件,用plt.imread就可以解决。

你可能感兴趣的:(ffmpeg学习)