我正在尝试从 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 删除音频的不同方法,