音频文件已经成功生成,但是音转文报错。
错误问题需要定位到音频文件,音频文件一定是出错了,导致音转文输入时没有内容,自然会报错。
一、首先拉流,拉取rstp视频流,能够拉取并正常显示。
二、使用python代码拉取视频流,也是能够正常拉取。
import cv2
cap = 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 命令的部分参数,主要差异体现在「传输协议配置」和「输入参数适配」上。直接使用相同的命令可能导致拉流失败(如连接超时、格式不支持)。