【问题标题】:How to concatenate clips getting from Kinesis Video Stream in Java如何连接从 Java 中的 Kinesis Video Stream 获取的剪辑
【发布时间】:2022-01-24 07:03:47
【问题描述】:

我正在使用 AWS Kinesis Video Stream 服务来获取我的视频记录。因此,由于 Kinesis Video Stream 片段的限制,事实证明我一次请求最多只能检索约 30 分钟的视频。我打算检索一个 2 小时的视频。

所以我循环请求并将所有 4 个响应放入 InputStream 的列表中,然后将它们转换为 SequenceInputStream,因为我尝试将它们全部链接在一起。

但是,当我成功将它们上传到 S3 存储桶并尝试从那里下载时。它显示我文件已损坏。我研究了SequenceInputStream,但似乎我的设计还可以。

此外,如果我延长视频长度,假设我有 24 个InputStream,并将它们全部链接到一个 SequenceInputStream,当我在序列输入流。

有什么方法可以实现我想要的或我的代码中的错误导致这种情况?

这是我的源代码:

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";
    }

已编辑:我遇到了一对名为 XugglerFFMPEG 的包,但是他们中的大多数都是从磁盘(有路径)获取视频文件,但就我而言,没有任何视频文件,因为我没有下载到本地,它们只存在于运行时,连接后会上传到S3。

感谢任何帮助!谢谢!

【问题讨论】:

  • 真的可以像这样连接剪辑吗?不是每个剪辑都有元数据吗?
  • @JustanotherJavaprogrammer 我实际上不确定,也许这就是为什么所有代码​​都不起作用的原因:(
  • 是的,您必须保存在磁盘上 - 否则我不知道 AWS 是否应该帮助您使用他们赚取数百万美元的工具,您不认为他们应该能够帮助您吗???跨度>

标签: java amazon-web-services ffmpeg xuggler amazon-kinesis-video-streams


【解决方案1】:

所以最后我只是下载了剪辑,在运行时将其保存到磁盘,使用mp4parser 合并它们并上传到 S3。之后我只是删除了我磁盘上的那些。

如果有人对代码感到好奇,则取自https://github.com/sannies/mp4parser/blob/master/examples/src/main/java/com/googlecode/mp4parser/AppendExample.java

谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多