提交 53d54e88 authored 作者: zw.wang's avatar zw.wang

feat: [isc_client] 使用组件编码H264摄像头

上级 c0881c71
......@@ -5,7 +5,8 @@ ARG WORKNAME
ENV LANG C.UTF-8
WORKDIR /root/isc-video-record
RUN pip install -U pip intelab-python-sdk
RUN pip install -U pip \
&& pip install -U intelab-python-sdk -i https://pypi.org/simple
RUN pip install supervisor \
&& echo_supervisord_conf > /etc/supervisord.conf \
......
......@@ -14,6 +14,7 @@ from intelab_python_sdk.ffmpeg.ffmpeg_concat import concat
from isc_video_record.db import rabbitmq_connect, redis_connect, influxdb
from isc_video_record.const import PROCESSING_CAMERA_KEY
from isc_video_record.utils.api_helper import IntelabApiHelper, PlaybackUrlException
from isc_video_record.utils.isc_client import HikVisionClient
from isc_video_record.utils import aliyun_oss
from isc_video_record.utils.record_utils import record_thread, get_video_duration, time_to_seconds
from isc_video_record.utils.alarm_utils import send_alarm_to_developer
......@@ -23,7 +24,11 @@ tz = pytz.timezone('Asia/Shanghai')
video_path = '/tmp/videos/isc-record'
os.makedirs(video_path, exist_ok=True)
api_helper = IntelabApiHelper()
hk_config = dynaconf.settings.get('ISC')
hik_client = HikVisionClient(str(hk_config.get('KEY')), hk_config.get('SECRET'),
hk_config.get('HOST'), hk_config.get('PORT'))
# api_helper = IntelabApiHelper()
class StreamRecorder:
......@@ -272,8 +277,8 @@ class ProcessMessage:
res = {'file_name': file_name, 'is_completed': False, 'recovered_time': start_time}
try:
playback_urls = api_helper.get_cameras_playback_urls(
self.body['camera_code'],
playback_urls = hik_client.get_cameras_playback_urls(
self.body['camera_index'],
IntelabApiHelper.iso_format(start_time),
IntelabApiHelper.iso_format(end_time)
)
......@@ -309,7 +314,7 @@ class ProcessMessage:
file_duration = time_to_seconds(file_info['duration'])
if not os.path.isfile(file_info['file_name']):
log.info('当前录制无文件输出:%s, 重试计数: %s', self.body['camera_code'], retry_count)
time.sleep(1)
time.sleep(5)
elif file_duration < complete_duration - 2:
# 视频文件时长小于完整时长
new_start_time = start_time + timedelta(seconds=file_duration)
......
......@@ -128,30 +128,36 @@ class HikVisionClient(object):
'endTime': end_time,
'recordLocation': 1,
'protocol': protocol,
'expand': 'fileSize=1024',
'expand': 'transcode=1&fileSize=1024&videotype=h264',
'streamform': streamform,
}
log.info('requests body: {}'.format(body))
expired_time = datetime.now() + timedelta(minutes=5)
res = self._request(uri, body)
results = []
for f in res.get('list') or []:
start_time = dateutil.parser.parse(f['beginTime'])
end_time = dateutil.parser.parse(f['endTime'])
results.append({
'start_time': start_time,
'end_time': end_time,
'expired_time': expired_time,
'stream_url': {
'url': res.get('url'),
'extra_args': 'playBackMode=1',
'protocol': protocol
}
})
return results
events = []
for pre_event in res.get('list') or []:
if pre_event.get('online', 1) == '0':
raise PlaybackUrlException({'message': 'offline', 'code': 404})
start_time = dateutil.parser.parse(pre_event['beginTime'])
end_time = dateutil.parser.parse(pre_event['endTime'])
if len(events) > 0 \
and start_time - events[-1]['end_time'] <= timedelta(seconds=2) \
and events[-1]['end_time'] - events[-1]['start_time'] <= timedelta(hours=0.5):
events[-1]['end_time'] = end_time
else:
events.append({
'start_time': start_time,
'end_time': end_time,
'expired_time': expired_time,
'stream_url': {
'url': res.get('url'),
'extra_args': 'playBackMode=1',
'protocol': protocol
}
})
return events
def event_subscription(self, callback):
""" 事件订阅接口
......
......@@ -4,18 +4,30 @@ import subprocess
from intelab_python_sdk.logger import log
def record_thread(stream_url, out_file, thread_name='ffmpeg-log'):
cmd = [
'ffmpeg',
'-y',
'-rw_timeout', '20000000',
'-v', 'info',
'-i', stream_url,
'-c', 'copy',
'-f', 'mp4',
out_file
]
def record_thread(stream_url, out_file, thread_name='ffmpeg-log', protocol='rtmp'):
if protocol == 'rtsp':
cmd = [
'ffmpeg',
'-y',
'-v', 'info',
'-use_wallclock_as_timestamps', '1',
'-rtsp_transport', 'tcp',
'-i', stream_url,
'-c', 'copy',
'-f', 'mp4',
out_file
]
else:
cmd = [
'ffmpeg',
'-y',
'-v', 'info',
'-rw_timeout', '20000000',
'-i', stream_url,
'-c', 'copy',
'-f', 'mp4',
out_file
]
log_buffer = error_log = ''
process = subprocess.Popen(cmd, stdout=subprocess.PIPE,
......
......@@ -24,7 +24,7 @@ requires = [
setuptools.setup(
name='isc-video-record',
version='1.0.0b9',
version='1.0.0b11',
description='ISC motion detection playback video stream recording service.',
long_description=long_description,
long_description_content_type='text/markdown',
......
......@@ -23,16 +23,17 @@ client = HikVisionClient(config.get('KEY'), config.get('SECRET'),
def main():
start_time = datetime(2021, 6, 23, 12, 15, 29).astimezone(tz)
start_time = datetime(2021, 6, 30, 18, 58, 29).astimezone(tz)
# start_time = datetime(2021, 5, 28, 9, 10, 59).astimezone(tz)
end_time = datetime(2021, 6, 23, 12, 17, 32).astimezone(tz)
camera_index = '1f1878fd4e8b4e60b2adb1c0290458e8'
end_time = datetime(2021, 6, 30, 18, 59, 0).astimezone(tz)
camera_index = 'be03d4d8b12344a9adc92bfbf11fef53'
results = []
try:
res = client.get_cameras_playback_urls(
camera_index,
client.iso_format(start_time), client.iso_format(end_time)
client.iso_format(start_time), client.iso_format(end_time),
protocol='rtsp'
)
results.extend(res)
except PlaybackUrlException as e:
......@@ -75,7 +76,7 @@ def stream_record(stream, start_time, end_time):
video_path, 'rtmp_{}_{}_{}.mp4'.format('y', start_time, end_time))
# TODO 多进程处理
print(stream_url, start_time, end_time)
record_thread(stream_url, file_name, thread_name='y')
record_thread(stream_url, file_name, thread_name='y', protocol=stream['protocol'])
return get_video_duration(file_name)
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论