需求
使用ffmpeg,对直播流进行下载,实现无人值守的自动录制。
比如对抖音的直播,通过ffmpeg直接下载到本地。
问题
一段时间的测试过后,发现使用ffmpeg下载会出现问题:
- 有时候明明直播已经结束了,而ffmpeg还显示在录制中。
- 有时候ffmpeg明明是正在录制,而且直播也没问题,但是下载到本地的视频时长不变。比如:直播1小时,ffmpeg从头下载到尾,没有人为打断的情况下,在第30分钟的时候停止下载了,但是ffmpeg显示正在录制。只有结束了你才能发现问题。
解法
以上两个问题,没查到什么解法。
我只好通过物理手段进行解决了。就是不断探查本地视频的时长,看是否在稳定增长,当检测到视频时长已经不变的时候,中断ffmpeg。
重新探测是否正在直播,如果正在直播则重新录制。
(因为正在下载的视频时长不好检测,所以改为通过检测视频大小来确定是否出问题)
刚开始的代码:
_output = subprocess.check_output(ffmpeg_command,stderr=subprocess.STDOUT)
解决代码:
_output = subprocess.Popen(ffmpeg_command, stdin=subprocess.PIPE, shell=False)
last_size = 0
last_name = ''
while True:
time.sleep(5)
mp4_path = get_last_file_name(full_path)
file_size = os.path.getsize(mp4_path)
print("文件大小:", file_size, os.path.basename(mp4_path))
if file_size == last_size and last_name == mp4_path:
_output.stdin.write('q'.encode("GBK")) # Simulate user pressing q key
_output.communicate()
_output.wait()
break
last_size = file_size
last_name = mp4_path
因为我的ffmpeg命令中,设置了视频自动分段,所以视频的路径不是固定的。
所以我用get_last_file_name去检测目标文件夹下的最后一个视频,即最新视频。
通过last_size和last_name记录上一时刻的视频大小和名称,file_size和mp4_path记录当前时刻的视频大小和名称,对比变化,判断是不是出问题。
如果出问题了,就中断进程。