使用FFmpeg将1080P视频转480P无输出?问题排查与解决
问题排查与解决方案
核心问题分析
你的代码没有捕获FFmpeg的错误输出,导致命令执行失败时无法看到具体报错;同时可能存在输出路径无效、码率设置不合理等问题,最终导致HLS文件无法生成。
第一步:捕获FFmpeg错误信息定位问题
subprocess.call默认不会打印FFmpeg的标准输出和错误输出,修改代码捕获这些信息才能找到根因:
import subprocess # 替换原subprocess.call为以下代码 result = subprocess.run( ['ffmpeg.exe','-i', pname1,'-vf', 'scale=-1:480,setsar=1:1','-c:v','libx264','-pix_fmt' ,'yuv420p','-b:v', str(cnt)+'K', '-bufsize', str(cnt)+'K' ,'-minrate', str(cnt)+'K','-maxrate', str(cnt)+'K', '-x264opts','keyint=60:min-keyint=60','-preset', 'veryfast', '-profile:v', 'high', '-f', 'hls', '-hls_time', '2', '-hls_list_size','0', pname2], capture_output=True, text=True ) # 打印输出与错误信息 print("FFmpeg标准输出:", result.stdout) print("FFmpeg错误输出:", result.stderr) print("返回码:", result.returncode)
执行后查看stderr内容,就能明确失败原因(比如路径不存在、码率过低、输入文件损坏等)。
常见问题修复方案
1. 输出目录不存在
如果pname2指向的目录未创建(例如output/hls/video.m3u8但output/hls目录不存在),FFmpeg无法生成文件。解决方法:执行命令前先创建目录:
import os # 提取输出文件的目录路径 output_dir = os.path.dirname(pname2) # 目录不存在则创建 if not os.path.exists(output_dir): os.makedirs(output_dir, exist_ok=True)
2. 码率设置不合理
480P视频的合理码率范围通常在500K-1500K之间,如果cnt值过小(比如低于200K),会导致编码失败。建议先固定一个合理值测试,例如'-b:v', '800K',确认能生成文件后再调整。
3. 输出路径权限不足
如果pname2所在目录无读写权限(比如Windows系统目录),FFmpeg会静默失败。确保输出路径所在目录有读写权限。
简化测试命令
先用最简化的命令测试能否生成480P HLS文件,排除复杂参数干扰:
subprocess.run( ['ffmpeg.exe', '-i', pname1, '-vf', 'scale=-1:480,setsar=1:1', '-c:v', 'libx264', '-pix_fmt', 'yuv420p', '-preset', 'veryfast', '-f', 'hls', pname2], capture_output=True, text=True )
如果该命令能生成文件,再逐步添加码率、keyint等参数,排查具体是哪个参数导致的问题。
内容的提问来源于stack exchange,提问作者david
相关产品推荐
相关产品推荐

