如何在 Java 中连接来自 Kinesis Video Stream 的剪辑
How to concatenate clips getting from Kinesis Video Stream in Java
我正在使用 AWS Kinesis Video Stream 服务来获取我的视频记录。因此,由于 Kinesis Video Stream 片段限制,事实证明我只能根据一个请求检索最多约 30 分钟的视频。我打算检索一个 2 小时的视频。
所以我循环请求并将所有 4 个响应放入 InputStream
列表中,然后我将它们变成 SequenceInputStream
因为我试图将它们链接在一起。
然而,当我成功将它们上传到 S3 存储桶并尝试从那里下载时。它显示我的文件已损坏。我研究了 SequenceInputStream
,但我的设计似乎还不错。
此外,如果我延长我的视频长度,假设我有 24 个 InputStream
,并且我将它们全部链接到一个 SequenceInputStream
,它会遇到 SSL Socket Exception: Connection Reset
当我运行 对序列输入流的 readAllBytes
操作。
有没有什么方法可以实现我想要的,或者我的代码中有什么错误导致了这个?
这是我的源代码:
private String downloadMedia(Request request, JSONObject response, JSONObject metaData, Date startDate, Date endDate) throws Exception {
long duration = endDate.getTime() - startDate.getTime();
long durationInMinutes = TimeUnit.MILLISECONDS.toMinutes(duration);
long intervalsCount = durationInMinutes / 30;
ArrayList<GetClipResult> getClipResults = new ArrayList<>();
for (int i = 0; i < intervalsCount; i++){
Media currentMedia = constructMediaAfterIntervalsBreakdown(metaData, request, startDate, endDate);
String deviceName = metaData.getString("name") + "_" + request.getId();
Stream stream = getStreamByName(name, request.getId());
String endPoint = getDataEndpoint(stream.getStreamName());
GetClipResult clipResult = downloadMedia(currentMediaDto, endPoint, stream.getStreamName());
if(clipResult != null){
getClipResults.add(clipResult);
}
startDate = currentMediaDto.getEndTime();
}
//Get presigned URL from S3 service response
String url = response.getJSONArray("data").getJSONObject(0).getJSONArray("parts").getJSONObject(0).getString("url");
if (getClipResults.size() > 0) {
Vector<InputStream> inputStreams = new Vector<>();
for (GetClipResult clipResult : getClipResults){
InputStream videoStream = clipResult.getPayload();
inputStreams.add(videoStream);
}
Enumeration<InputStream> inputStreamEnumeration = inputStreams.elements();;
SequenceInputStream sequenceInputStream = new SequenceInputStream(inputStreamEnumeration);
if (sequenceInputStream.available() > 0){
sequenceInputStream.readAllBytes();
byte[] bytes = sequenceInputStream.readAllBytes();
String message = uploadFileUsingSecureUrl(url, bytes, metaData);
return message;
}
}
return "failed";
}
已编辑:我遇到了几个名为 Xuggler
和 FFMPEG
的软件包,但其中大多数都是从磁盘(有路径)获取视频文件,但就我而言,没有'任何视频文件,因为我没有下载到本地,它们只存在于运行时间,稍后连接后上传到S3。
感谢任何帮助!谢谢!
所以最后我只是下载了剪辑,在运行时将其保存到磁盘,使用 mp4parser
合并它们并上传到 S3。之后我就把我磁盘上的那些删除了。
如果有人对代码感到好奇,它来自https://github.com/sannies/mp4parser/blob/master/examples/src/main/java/com/googlecode/mp4parser/AppendExample.java
谢谢。
我正在使用 AWS Kinesis Video Stream 服务来获取我的视频记录。因此,由于 Kinesis Video Stream 片段限制,事实证明我只能根据一个请求检索最多约 30 分钟的视频。我打算检索一个 2 小时的视频。
所以我循环请求并将所有 4 个响应放入 InputStream
列表中,然后我将它们变成 SequenceInputStream
因为我试图将它们链接在一起。
然而,当我成功将它们上传到 S3 存储桶并尝试从那里下载时。它显示我的文件已损坏。我研究了 SequenceInputStream
,但我的设计似乎还不错。
此外,如果我延长我的视频长度,假设我有 24 个 InputStream
,并且我将它们全部链接到一个 SequenceInputStream
,它会遇到 SSL Socket Exception: Connection Reset
当我运行 对序列输入流的 readAllBytes
操作。
有没有什么方法可以实现我想要的,或者我的代码中有什么错误导致了这个?
这是我的源代码:
private String downloadMedia(Request request, JSONObject response, JSONObject metaData, Date startDate, Date endDate) throws Exception {
long duration = endDate.getTime() - startDate.getTime();
long durationInMinutes = TimeUnit.MILLISECONDS.toMinutes(duration);
long intervalsCount = durationInMinutes / 30;
ArrayList<GetClipResult> getClipResults = new ArrayList<>();
for (int i = 0; i < intervalsCount; i++){
Media currentMedia = constructMediaAfterIntervalsBreakdown(metaData, request, startDate, endDate);
String deviceName = metaData.getString("name") + "_" + request.getId();
Stream stream = getStreamByName(name, request.getId());
String endPoint = getDataEndpoint(stream.getStreamName());
GetClipResult clipResult = downloadMedia(currentMediaDto, endPoint, stream.getStreamName());
if(clipResult != null){
getClipResults.add(clipResult);
}
startDate = currentMediaDto.getEndTime();
}
//Get presigned URL from S3 service response
String url = response.getJSONArray("data").getJSONObject(0).getJSONArray("parts").getJSONObject(0).getString("url");
if (getClipResults.size() > 0) {
Vector<InputStream> inputStreams = new Vector<>();
for (GetClipResult clipResult : getClipResults){
InputStream videoStream = clipResult.getPayload();
inputStreams.add(videoStream);
}
Enumeration<InputStream> inputStreamEnumeration = inputStreams.elements();;
SequenceInputStream sequenceInputStream = new SequenceInputStream(inputStreamEnumeration);
if (sequenceInputStream.available() > 0){
sequenceInputStream.readAllBytes();
byte[] bytes = sequenceInputStream.readAllBytes();
String message = uploadFileUsingSecureUrl(url, bytes, metaData);
return message;
}
}
return "failed";
}
已编辑:我遇到了几个名为 Xuggler
和 FFMPEG
的软件包,但其中大多数都是从磁盘(有路径)获取视频文件,但就我而言,没有'任何视频文件,因为我没有下载到本地,它们只存在于运行时间,稍后连接后上传到S3。
感谢任何帮助!谢谢!
所以最后我只是下载了剪辑,在运行时将其保存到磁盘,使用 mp4parser
合并它们并上传到 S3。之后我就把我磁盘上的那些删除了。
如果有人对代码感到好奇,它来自https://github.com/sannies/mp4parser/blob/master/examples/src/main/java/com/googlecode/mp4parser/AppendExample.java
谢谢。