当前位置: 首页 > 工具软件 > JAVE > 使用案例 >

使用Jave转换音视频格式(网页有声音没图像,小程序不能播放问题)

茹航
2023-12-01

最近开发微信小程序的时候,遇到了一个问题:
用户在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包

  1. 在pom.xml中引入maven配置
<dependency>
	<groupId>ws.schild</groupId>
	<artifactId>jave-all-deps</artifactId>
	<version>3.3.1</version>
</dependency>
  1. 转码工具类(呼吁各位贴代码的时候请带上import包的信息)
    开发小程序的请注意
    如果你出现了MP4视频文件小程序不能播放的问题。
    请考虑以下两点:
    1 URL连接中是否包含中文,比如文件名字是中文,替换成英文或数字试一下。
    2 请查看视频文件是否是 H264(Main),如果是H264(high)的话,转成H264(Main)试一下。
    video.setX264Profile(X264_PROFILE.MAIN);
    我遇到的就是上面两个问题导致视频在小程序中播放不了。
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

 类似资料: