利用FFMPEG解决不同设备下视频发生旋转问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_20965753/article/details/89218398

FFMPEG可以实现视频/音频的编码和解码, 几乎囊括了现有的视频/音频编码标准. 在涉及到视频/音频开发时, 都离不开FFMPEG.

在Windows平台下, FFMPEG有三个exe文件:
ffmpeg.exe: 视频文件转换命令行工具.
ffplay.exe: 查看文件格式的应用程序.
ffplay.exe: 用于播放的应用程序.

涉及到视频/音频的开发, 首选FFMPEG工具.

1. 人脸对齐这, 出现的问题是:

如果原始视频宽:高>1, 原始视频是较宽的视频, 那么在软件/手机上的视频和电脑系统上的视频是一致的.
如果原始视频宽:高<1, 原始视频是较高的视频, 那么由于电脑现在都是宽屏, 所以在电脑上显示的时候就会导致视频发生向左旋转90度的问题!

2. 采用FFMPEG包下的ffprobe, 可以读取视频(多媒体)流中的信息. 如果视频发生了旋转, 即发生了上述的问题, 那么信息中会出现"tags": {“rotate”: “90”}字段. 如果信息中包含该字段, 那么就将原始视频进行旋转!

根据字段按照6(3)的方式处理!!!

输出字段是:

    "rotate": "270",
    "creation_time": "2019-03-12T07:02:26.000000Z",
    "language": "eng",
    "handler_name": "VideoHandle"
},
"side_data_list": [
    {
        "side_data_type": "Display Matrix",
        "displaymatrix": "\n00000000:            0      -65536
0\n00000001:        65536           0           0\n00000002:            0
0  1073741824\n",
        "rotation": 90
    }

3. FFProbe, 在读取视频(多媒体)流时, 允许视频(多媒体)路径中含有中文或空格!!!

1> 如果旋转的视频路径中不含有中文或空格, 那么可以使用以下方法读取屏幕输出信息:
result = os.popen(cmd)
print(result)
result = result.read() # string!
print(result) # string: {"stream": [{}, "tags": {"rotate": "90"}, "side_data_list": [], ...]}
for line in out.splitlines():
	......

2> 如果旋转视频中含有中文或空格, 使用以下方法获取屏幕输出信息:
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
out, err = p.communicate()
if "rotate" in str(out):
    ......

3> 在字符串中嵌入双引号, 单引号: 在双引号前面加个转义符\, 即反斜杠. 如"Hello  \"W \"orld", 会输出Hello "W"orld. 以此来定义:
benchmark_clockwise_90 = "\"rotate\": \"90\""
benchmark_clockwise_180 = "\"rotate\": \"180\""
benchmark_counterclockwise_90 = "\"rotate\": \"-90\""
benchmark_counterclockwise_180 = "\"rotate\": \"-180\""

4. 在对视频进行旋转操作时, 有两种方式: 1) 一种是利用ffmpeg.exe, 加上-vf和条件即可. 直接利用ffmpeg.exe进行视频的旋转并保存结果视频. 2) 一种是对视频的每一帧进行处理. 这两种方法的效率差不多.

对远程服务器路径, 如123服务器上的路径, 也可以支持!

5. 对于含有空格路径的视频, cv2.VideoCapture(input_file)可以直接处理; 但是FFMPEG却不能处理含有空格的路径, 解决办法是: 给路径加上引号即可!!! 即可以这样处理FFMPEG的输入路径: ffprobe_input_file = “”" + input_file + “”".

6.

(1) 旋转视频的问题, 有的是由于视频解码器的问题, 采用VLC播放器可以直接解决一些视频; 但有些视频使用VLC播放器并不能解决.
(2) 如果采用人脸检测+人脸关键点检测, 来估计人脸的旋转角度, 这个方法也行不通. 因为视频的种类较多, 包括眼镜遮挡, 口罩遮挡等, 旋转等问题. 因此, 人脸检测+人脸关键点检测结果不可能好.
(3) 这样处理: 在输出字段中, 如果是"rotate": “90”, 就表示应该将原始视频顺时针旋转90度, 即k=-1; 如果是"rotate": “180”, 那么也顺时针旋转90度, 即k=-1.
如果是"rotate": “270”, 那么逆时针旋转90度, 即k=1. 如果没有出现"rotate"字段, 那么也顺时针旋转90度, 即k=-1.

出现了其他的情况再添加!!!

(4) 这个可能需要多线程操作, 为了减少操作时间.

7. 为了使得保存的旋转视频和原始视频具有相应的目录结构, 可以借助于os.path.relpath()函数. 修改原有结果视频路径的创建方法.

os.path.relpath(path[, start]): 从start开始计算相对路径.

python项目中必须包含一个 requirements.txt 文件, 用于记录所有依赖包及其精确的版本号. 以便新环境部署.
requirements.txt可以通过pip命令自动生成和安装, 利用pip freeze >生成的requirements.txt是包含了当前Python环境的所有package和version, 需要根据项目自行删除一些不需要的package.
pip freeze > requirements.txt

安装requirements.txt依赖
pip install -r requirements.txt

猜你喜欢

转载自blog.csdn.net/qq_20965753/article/details/89218398