从 MP4 文件中删除音频会导致文件损坏

问题描述 投票:0回答:0

我正在尝试从 MP4 文件中删除音频,然后将静音版本上传到 S3 存储桶。我正在使用 MP4Parser 执行此操作。一些文件有效,并且静音版本按预期上传。其他人上传,但无法查看。相反,有一个错误屏幕显示“由于文件已损坏,无法观看此视频。”有效的文件永远有效,无效的文件永远无效。这是删除音频的功能:

private static void removeAudioFromVideo(MovieBox movieBox, IsoFile isoFile,
                                          String filePath, String requestId) throws IOException {
     Path path = Paths.get(filePath);
     path = path.getFileName();
     String fileName = path.toString();

     List<TrackBox> trackBoxesToRemove = new ArrayList<>();
     for (TrackBox trackBox : movieBox.getBoxes(TrackBox.class)) {
         String handlerType = trackBox.getMediaBox().getHandlerBox().getHandlerType();
         if(handlerType.equals(AUDIO_HANDLER_TYPE)) {
             trackBoxesToRemove.add(trackBox);
         }
     }
     for (TrackBox trackBox : trackBoxesToRemove) {
         movieBox.getBoxes().remove(trackBox);
     }
     ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
     WritableByteChannel byteChannel = Channels.newChannel(outputStream);
     isoFile.getBox(byteChannel);

     byte[] mutedFileBytes = outputStream.toByteArray();
     ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(mutedFileBytes);
     ObjectMetadata objectMetadata = new ObjectMetadata();
     objectMetadata.setContentLength(mutedFileBytes.length);

     s3Client.putObject(INPUT_BUCKET_NAME, "input/HFE/"+ requestId
             + "/refinedVideo/refined_" + fileName, byteArrayInputStream, objectMetadata);
     byteArrayInputStream.close();
     byteChannel.close();
     outputStream.close();
 }

我知道这个问题与音频删除有关,因为如果我删除音频删除,所有文件都会成功上传。在这些行中删除了音频:

 for (TrackBox trackBox : trackBoxesToRemove) {
     movieBox.getBoxes().remove(trackBox);
 }

我不确定我还能如何删除音频。好像是文件的问题。我曾尝试使用 FFMPEG 查看一些元数据,但没有发现有效文件和无效文件之间的明显区别。为此,我也对其他 Java 库开放(最好不是 ffmpeg,我有依赖性问题),或者使用 MP4Parser 删除音频的不同方法,

java audio mp4 mp4parser
© www.soinside.com 2019 - 2024. All rights reserved.