Python调用FFmpeg调整视频分辨率遇问题,求正确方案及复原方法
问题分析与解决方案
1. 第一个命令报错原因
subprocess.call(['ffmpeg.exe', '-y', '-i', pname1, '-vf', 'scale=-1:480,setsar=1:1', '-c:v','libx264', '-c:a', 'copy', pname2])
报错提示"Invalid data found when processing input",和scale参数无关,大概率是以下情况:
- 输入文件路径
pname1包含空格或特殊字符,ffmpeg无法正确解析,需将路径用引号包裹(Python中可通过f'"{pname1}"'处理) - 输入视频文件本身损坏、格式不被ffmpeg支持
- ffmpeg未自动识别文件格式,可尝试添加
-f参数指定格式(如-f mp4)辅助解析
2. 第二个命令得到640x360的原因
scale=640:-2中,-2是ffmpeg的比例保持标识:会严格按照原视频的宽高比自动计算高度。原视频为1920x1080(16:9比例),640对应的等比例高度为 640 * (1080/1920) = 360,因此输出为640x360,这是ffmpeg默认的比例优先行为。
3. 正确转成640x480的方法
要得到640x480(4:3比例),有两种可选方案:
方案A:强制拉伸画面(不保持原比例)
直接指定宽高,忽略原视频比例,命令如下:
subprocess.call(['ffmpeg.exe', '-y', '-i', pname1, '-vf', 'scale=640:480,setsar=1:1', '-c:v','libx264', '-c:a', 'copy', pname2])
注:此方法会让16:9的画面被拉伸为4:3,人物或场景会出现变形。
方案B:保持画面比例(添加黑边)
如果不想画面变形,可先按原比例缩小到640x360,再在上下添加黑边补至640x480,命令如下:
subprocess.call(['ffmpeg.exe', '-y', '-i', pname1, '-vf', 'scale=640:-2,pad=640:480:(ow-iw)/2:(oh-ih)/2,setsar=1:1', '-c:v','libx264', '-c:a', 'copy', pname2])
scale=640:-2:按原比例缩小到宽度640,高度自动计算为360pad=640:480:(ow-iw)/2:(oh-ih)/2:将画面补至640x480,黑边居中分布
4. 恢复原分辨率1920x1080的方法
根据之前的转换方式选择对应命令:
对应方案A(拉伸成640x480)
直接强制缩放回1920x1080,画面会反向拉伸恢复原比例:
subprocess.call(['ffmpeg.exe', '-y', '-i', pname2, '-vf', 'scale=1920:1080,setsar=1:1', '-c:v','libx264', '-c:a', 'copy', pname3])
对应方案B(带黑边的640x480)
先裁剪掉上下黑边,再按原比例缩放回1920x1080:
subprocess.call(['ffmpeg.exe', '-y', '-i', pname2, '-vf', 'crop=640:360:0:60,scale=1920:-2,setsar=1:1', '-c:v','libx264', '-c:a', 'copy', pname3])
crop=640:360:0:60:裁剪掉上下各60像素的黑边,还原为640x360的16:9画面scale=1920:-2:按比例缩放回1920x1080
内容的提问来源于stack exchange,提问作者david
相关产品推荐
相关产品推荐

