最近开发微信小程序的时候,遇到了一个问题:
用户在PC后端上传的mp4格式的视频文件,在PC端只有声音没有图像,在小程序端完全不能播放。
最后结果:
1. PC浏览器video标签播放时,只有声音,没有图像。
用户上传不能正常播放的mp4文件编码格式为 hevc,即H.265格式。在浏览器的video标签中,出现只有声音没有图像的问题。
故需要进行转码,转换成H.264编码格式即可。
转码见下文。
2. 小程序端不能播放。
小程序的video标签API说是支持H264格式。经过测试,发现实际支持H264(Main),不支持H264(High)。H264 (Main)可以正常播放,但H264(High)不行。
故需要转码成H264(Main)编码的MP4文件即可。
转码见下文。
文件转码
使用的是ws.schild.jave包
<dependency>
<groupId>ws.schild</groupId>
<artifactId>jave-all-deps</artifactId>
<version>3.3.1</version>
</dependency>
package com.util;
import java.io.File;
import java.nio.file.Paths;
import ws.schild.jave.Encoder;
import ws.schild.jave.MultimediaObject;
import ws.schild.jave.encode.AudioAttributes;
import ws.schild.jave.encode.EncodingAttributes;
import ws.schild.jave.encode.VideoAttributes;
import ws.schild.jave.encode.enums.X264_PROFILE;
import ws.schild.jave.info.MultimediaInfo;
import ws.schild.jave.info.VideoInfo;
import ws.schild.jave.info.VideoSize;
public class VideoUtil {
public static void convertVideoToMP4(String originalFilePath, String resultFilePath) {
try {
File originalFile = new File(originalFilePath);
MultimediaObject multimediaObject = new MultimediaObject(originalFile);
MultimediaInfo info = multimediaObject.getInfo();
VideoInfo videoInfo = info.getVideo();
VideoSize size = videoInfo.getSize();
System.out.println("原视频宽:" + size.getWidth());
System.out.println("原视频高:" + size.getHeight());
System.out.println("原视频比特率:" + videoInfo.getBitRate() / 1000);
System.out.println("原视频编码:" + videoInfo.getDecoder());
VideoAttributes video = new VideoAttributes();
//设置视频编码
video.setCodec("h264");
video.setX264Profile(X264_PROFILE.MAIN);
File resultFile = new File(resultFilePath);
AudioAttributes audio = new AudioAttributes();
//设置编码器名称
audio.setCodec("aac");
EncodingAttributes attrs = new EncodingAttributes();
//设置转换后的格式
attrs.setOutputFormat("mp4");
attrs.setAudioAttributes(audio);
attrs.setVideoAttributes(video);
Encoder encoder = new Encoder();
encoder.encode(multimediaObject, resultFile, attrs);
MultimediaObject multimediaObjectOfter = new MultimediaObject(Paths.get(resultFilePath).toFile());
MultimediaInfo info1 = multimediaObjectOfter.getInfo();
VideoInfo video1 = info1.getVideo();
VideoSize size1 = video1.getSize();
System.out.println("转换后视频宽:" + size1.getWidth());
System.out.println("转换后视频高:" + size1.getHeight());
System.out.println("转换后视频比特率:" + video1.getBitRate() / 1000);
System.out.println("转换后视频编码:" + video1.getDecoder());
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
String originalFilePath = "d://1.mp4";
String resultFilePath = "d://2.mp4";
convertVideoToMP4(originalFilePath, resultFilePath);
}
}
可以看到日志如下:
原视频宽:640
原视频高:340
原视频比特率:223
原视频编码:hevc (Main) (hev1 / 0x31766568)
16:21:19.222 logback [main] INFO w.s.jave.ConversionOutputAnalyzer - Unhandled message in step: 2 Line: 22 message: <[libx264 @ 00000000028ba280] using SAR=1/1>
16:21:19.227 logback [main] INFO w.s.jave.ConversionOutputAnalyzer - Unhandled message in step: 2 Line: 23 message: <[libx264 @ 00000000028ba280] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2>
16:21:19.228 logback [main] INFO w.s.jave.ConversionOutputAnalyzer - Unhandled message in step: 2 Line: 24 message: <[libx264 @ 00000000028ba280] profile Main, level 3.0, 4:2:0, 8-bit>
16:21:19.228 logback [main] INFO w.s.jave.ConversionOutputAnalyzer - Unhandled message in step: 2 Line: 25 message: <[libx264 @ 00000000028ba280] 264 - core 164 r3075 66a5bc1 - H.264/MPEG-4 AVC codec - Copyleft 2003-2021 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x1:0x111 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=11 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00>
16:21:30.098 logback [main] INFO w.s.jave.ConversionOutputAnalyzer - Unhandled message in step: 3 Line: 70 message: <[mp4 @ 00000000028b6f80] Starting second pass: moving the moov atom to the beginning of the file>
转换后视频宽:640
转换后视频高:340
转换后视频比特率:281
转换后视频编码:h264 (Main) (avc1 / 0x31637661)
可以看到文件已经转换成h264 (Main) 格式,这种格式可以兼容PC网页和小程序。
如果是h264 (High),则小程序端不能播放,PC页面可以正常播放。
最后附上Jave2 Github传送门:
https://github.com/a-schild/jave2