阿里云OSS上传视频前端只能声音没有图像(黑屏)解决办法

it2026-04-12  3

阿里云OSS上传视频前端只有声音没有图像(黑屏)解决办法

原因解决办法结果总结

原因

今天前端开发告诉上传图片发现视频只有声音没有图像,让他发视频给我上传一遍发现有声音有图像,情况如下图,在postman中视频可播放,但是没有画面 最后在阿里云的这篇文档里找到问题的原因: 问题在于视频编码格式的问题,视频文件为MPEG4或HEVC等格式(H.265编码),常见的Web浏览器暂不兼容该编码的视频文件。

前端发给我的时候,微信已经经过一遍压缩转码(发过来给我时文件小了很多,一开始以为是文件大小的问题),所以上传后有图像有声音。

解决办法

1、这个问题属于前端问题,让前端适配H.265即可。 2、将视频转码为H.264编码,用于前端因特殊原因无法解决才使用的方法。 pom配置

<!-- windows使用这个坐标 --> <!-- <dependency>--> <!-- <groupId>ws.schild</groupId>--> <!-- <artifactId>jave-native-win64</artifactId>--> <!-- <version>2.4.5</version>--> <!-- </dependency>--> <!-- osx使用这个坐标 --> <!-- <dependency>--> <!-- <groupId>ws.schild</groupId>--> <!-- <artifactId>jave-native-osx64</artifactId>--> <!-- <version>2.4.4</version>--> <!-- </dependency>--> <!-- linux使用这个坐标 --> <dependency> <groupId>ws.schild</groupId> <artifactId>jave-native-linux64</artifactId> <version>2.4.4</version> </dependency>

java代码

// 上传的文件 File tempFile = File.createTempFile(UUID.randomUUID().toString(), suffix); // 将前端上传的MultipartFile转为File multipartFile.transferTo(tempFile); // 如果是视频需要转码的文件 File file = File.createTempFile(UUID.randomUUID().toString(), suffix); // TODO 根据你的逻辑来判断文件是不是视频 AudioAttributes audio = new AudioAttributes(); // 音频编码格式 audio.setCodec("libmp3lame"); audio.setBitRate(800000); audio.setChannels(1); VideoAttributes video = new VideoAttributes(); // 编码格式 video.setCodec("libx264"); video.setBitRate(3200000); // 帧率 video.setFrameRate(15); EncodingAttributes attrs = new EncodingAttributes(); attrs.setFormat("mp4"); // 设置音频 attrs.setAudioAttributes(audio); // 设置视频画面 attrs.setVideoAttributes(video); Encoder encoder = new Encoder(); MultimediaObject multimediaObject = new MultimediaObject(tempFile); encoder.encode(multimediaObject, file, attrs); // 上传到阿里云OSS String url = ossUtil.upload(FileTypeEnum.IMAGE, file); // 删除临时文件 tempFile.delete(); file.delete(); // 返回url return url;

结果

postman预览,可以正常显示视频图像 如果分片上传,postman显示结果是下面的结果,设置ContentType即可预览 java代码

// 获取文件类型 String type = Files.probeContentType(file.toPath()); ObjectMetadata metadata = newObjectMetadata(); metadata.setContentType(type); // 非分片上传使用 // PutObjectRequest request = new PutObjectRequest(bucketName, fileUrl, file, metadata) // 分片上传使用 InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, fileUrl, metadata);

总结

因为看还看到别人写过OSS无法显示图像解决办法,所以写给碰到这个问题的人,希望大家少走弯路,拿更多时间去学习工作,谢谢观看!

最新回复(0)