ffmpeg python批处理视频文件 增加关键帧 解决seekTo不准确问题

时间:2022-04-09 23:11:15

最近在做视频播放功能,用到了ijkplayer,发现在视频未缓冲,拖动进度条会出现进度条倒退,甚至从起点开始的情况(好像跟之前的B站一样),而且当Activity onstop时保存进度,在onRestart时seekTo到上一次位置,会一直从0开始播放。 在网上查阅一些资料后,发现是由于视频中没有关键帧,而seekTo会从目标position最近关键帧的位置开始播放视频,如果没有关键帧,则从头开始播放。。。 于是乎,我们打算使用ffmpeg处理视频,每秒加一个关键帧

以MAC为例
首先你需要从ffmpeg官网下载该程序,比如ffmpeg-X.Y.Z.7z 是发布版本,不用编译,直接解压缩即可使用。
然后把在ffmpeg存储目录下创建python脚本,以及input文件夹,用于存放输入视频文件(文件可以有很复杂的目录),以及output文件夹,用于存放输出视频文件(输出文件跟输入文件的目录结构一样)。
python 代码(2.7):

# coding=utf-8
import string
import os
import time
import re
import sys

#你的根目录
ffmpeg_path = '/Users/sanjieke1/Downloads/videofactory'
ffmpeg_name = ffmpeg_path + '/ffmpeg'

ff_input = ffmpeg_path + '/input'
ff_output = ffmpeg_path + '/putput'

print '开始查找视频内容'

for parent,dirnames,filenames in os.walk(ff_input): #三个参数:分别返回1.父目录 2.所有文件夹名字(不含路径) 3.所有文件名字

for filename in filenames: #输出文件信息
# print 'here is file \n==========\n'
# print "parent is : " + parent
# print "filename is : " + filename
# print "the full name of the file is : " + os.path.join(parent,filename) #输出文件路径信息
if filename.endswith('.mp4'):
print '\n==================================\n处理新输入文件:'

outfolder = parent.replace('/input','/output')
print '输出父文件夹 :' + outfolder
if not os.path.exists(outfolder):
os.makedirs(outfolder)

print "输入文件路径 : " + os.path.join(parent,filename) #输出文件路径信息
outpath = os.path.join(parent,filename).replace('/input','/output')
print "输出文件路径 : " + outpath
print '...'
print '开始处理文件,请稍后'
print '...'
# 调用系统命令,每25帧加一个关键帧
os.system(ffmpeg_name + ' -i ' + os.path.join(parent,filename) + ' -g 25 ' + outpath)