android - 如何从 android 设备摄像头直播以将视频块存储在 Amazon S3 存储桶上?
问题描述
我正在开发一个围绕视频录制和分析的 Android 解决方案项目。这个想法是,由于视频会很大,所以我必须设计一个解决方案,其中说每 30 分钟(可以从 1 分钟到 30 分钟不等),我的代码应该选择一个缩减的视频文件并上传到云,从设备中删除该部分,同时摄像头继续监视和捕获视频源。例如,一旦我在上午 8:00 开始流式传输或录制并使用 1 分钟的间隔,存储在 S3 存储桶上的视频文件应该具有如下数据:
第一个视频文件 - 从上午 8:00 到上午 8:01
第二个视频文件 - 从上午 8:01 到上午 8:02
……
依此类推,直到流停止。
目前,我正在使用来自https://github.com/awslabs/aws-sdk-android-samples的 AmazonKinesisVideoDemoApp 。
我使用 Kinesis Video Streams 作为媒介,我可以开始从我的 android 设备流式传输到 kinesis,并在 python 中使用 GET_HLS_STREAMING_SESSION_URL API 从流中获取视频并存储在 s3 存储桶中。
def save_chunks_to_s3(init_time, time_range):
timestamp = datetime.strptime(init_time, "%Y%m%d_%H%M%S")
while True:
playback_url = kvam.get_hls_streaming_session_url(StreamName=STREAM_NAME, PlaybackMode='ON_DEMAND',
HLSFragmentSelector={
'FragmentSelectorType': 'SERVER_TIMESTAMP',
'TimestampRange': {
'StartTimestamp': timestamp,
'EndTimestamp': timestamp + timedelta(seconds=time_range)
}
}
)['HLSStreamingSessionURL']
vcap = cv2.VideoCapture(playback_url)
fwidth = int(vcap.get(cv2.CAP_PROP_FRAME_WIDTH))
fheight = int(vcap.get(cv2.CAP_PROP_FRAME_HEIGHT))
length = int(vcap.get(cv2.CAP_PROP_FRAME_COUNT))
current_time = timestamp.strftime("%Y%m%d_%H%M%S")
filename = 'output_'+current_time+'.avi'
print("Saving to file "+filename)
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
out = cv2.VideoWriter(filename,fourcc, 20.0, (fwidth,fheight))
(grabbed, frame) = vcap.read()
if grabbed:
# Capturing all the frames
while(length>0):
if frame is not None:
out.write(frame)
length -= 1
(grabbed, frame) = vcap.read()
out.release()
vcap.release()
# Storing to s3 bucket
with open(filename, 'rb') as data:
s3.upload_fileobj(data, 'android-kinesis-video-chunks', 'android_stream_'+filename)
print("Saved to file "+filename)
timestamp = timestamp + timedelta(seconds=time_range)
else:
out.release()
vcap.release()
break
s3 = boto3.client("s3")
kvs = boto3.client("kinesisvideo")
response = kvs.get_data_endpoint(APIName="GET_HLS_STREAMING_SESSION_URL", StreamName=STREAM_NAME)
# Grab the endpoint from GetDataEndpoint
endpoint = response['DataEndpoint']
# Grab the HLS Stream URL from the endpoint
kvam = boto3.client("kinesis-video-archived-media",
endpoint_url=endpoint,
region_name=REGION_NAME,
aws_access_key_id=AWS_ACCESS_KEY_ID,
aws_secret_access_key=AWS_SECRET_ACCESS_KEY)
while True:
try:
# This will throw ResourceNotFoundException if not streaming
live_url = kvam.get_hls_streaming_session_url(StreamName=STREAM_NAME, PlaybackMode="LIVE")['HLSStreamingSessionURL']
init_utc_time = datetime.utcnow().strftime("%Y%m%d_%H%M%S")
start_time = time.time()
# Storing will start after a delay of 90s after live stream started
while(time.time()-start_time<90):
print(time.time()-start_time)
# Using interval range of 1 minute
save_chunks_to_s3(init_utc_time, 60)
except:
print("Waiting for live stream......")
在 android 设备上启动视频流之前,我在本地机器上运行上述代码。但是要求是要么使用一些无服务器解决方案运行它,要么找到一些其他将视频直接流式传输到 S3 的解决方案。
解决方案
推荐阅读
- laravel - 如何确保新路由在 laravel 中命中正确的中间件
- angular - 如何将异步管道与 Observable 一起使用
- c# - Visual Studio 2019 Intellisense for Linq 加入类未出现
- azure - “X”的帐户凭据不正确(但连接字符串在我的机器上有效)
- android - 使图标从底部导航栏向外窥视
- vuex - 从 JS 文件访问 Nuxt 项目中的 Vuex 存储
- asp.net - 到 Application Insights 的 Serilog 请求日志记录为 Trace
- r - How to match and combine dates and variables from two different dataframes in R
- c++ - 缓存行为是否解释了减少 C++ 写入时间以释放存储?
- c++ - MsgWaitForMultipleObjects 异常将 Internet Explorer 浏览器帮助程序对象迁移到 Google Chrome