在使用ffmpeg与音转文模型时,会报错音转文stack expects a non-empty Tensor List
音频文件已经成功生成,但是音转文报错。
错误问题需要定位到音频文件,音频文件一定是出错了,导致音转文输入时没有内容,自然会报错。
一、首先拉流,拉取rstp视频流,能够拉取并正常显示。
二、使用python代码拉取视频流,也是能够正常拉取。
import cv2cap = cv2.VideoCapture('rtsp://admin:Jhx134679@192.168.1.222:554/Streaming/Channels/101')print(cap)
ret,frame = cap.read()
while ret:ret,frame = cap.read()cv2.imshow("current frame",frame)cv2.imwrite('frame.jpg', frame)if cv2.waitKey(1) & 0xFF == ord('q'):break
cv2.destroyAllWindows()
cap.release()
三、根据音转文模型,针对生成的文件进行识别,错误信息与项目中运行一致,从而断定是在Ffmpeg视频生成模块出现问题。
最终解决方案
针对rstp视频流:必须添加 -rtsp_transport tcp
(且放在 -i
之前),否则可能因 UDP 丢包导致音视频为空。
原代码:
command = (f"ffmpeg -i {self.rtsp_url} -rtsp_transport tcp -movflags +faststart "f"-f segment -segment_time {self.segment_duration} -reset_timestamps 1 -strftime 1 "f"-map 0:a -c:a pcm_s16le {segment_wav} "f"-f segment -segment_time {self.segment_duration} -reset_timestamps 1 -strftime 1 "f"-map 0:v -map 0:a -c:v copy -c:a aac {segment_mp4}")
改进后:
command = (f"ffmpeg -rtsp_transport tcp " # 1. 先指定RTSP传输模式(TCP必须在输入前)f"-i ***** " # 2. 输入RTSP流f"-map 0:a:0 " # 3. 明确提取第1个音频轨道(0:a:0 = 流0的音频轨道0)f"-c:a pcm_s16le " # 4. 音频编码(WAV标准格式)f"-ar 16000 " # 5. 强制采样率16000Hz(避免格式不兼容)f"-ac 1 " # 6. 强制单声道(简化处理)f"-f segment " # 7. 切片输出f"-segment_time 10 " # 切片时长(如10秒)f"-reset_timestamps 1 " # 重置每个切片的时间戳f"-strftime 1 " # 用时间戳命名文件f"" # 音频输出路径# 视频切片参数(补充轨道指定)f"-map 0:v:0 -map 0:a:0 " # 明确提取第1个视频轨道+第1个音频轨道f"-c:v copy -c:a aac " # 视频复制编码,音频AAC编码f"-f segment "f"-segment_time 10 "f"-reset_timestamps 1 "f"-strftime 1 "f"" # 视频输出路径)
针对不同的视频流格式(RTSP、HTTP-FLV、HTTPS-FLV),需要调整 FFmpeg 命令的部分参数,主要差异体现在「传输协议配置」和「输入参数适配」上。直接使用相同的命令可能导致拉流失败(如连接超时、格式不支持)。