如何优雅的用java实现视频转码

青苗 青苗 | 471 | 2023-03-28

如何优雅的用java实现视频转码

引入依赖

依赖版本查询 https://search.maven.org/search?q=jave-all-deps

<dependency>
    <groupId>ws.schild</groupId>
    <artifactId>jave-all-deps</artifactId>
    <version>最新版本</version>
</dependency>

编码测试

package test;

import java.io.File;
import ws.schild.jave.AudioAttributes;
import ws.schild.jave.AudioInfo;
import ws.schild.jave.Encoder;
import ws.schild.jave.EncodingAttributes;
import ws.schild.jave.MultimediaInfo;
import ws.schild.jave.MultimediaObject;
import ws.schild.jave.VideoAttributes;
import ws.schild.jave.VideoInfo;
import ws.schild.jave.VideoSize;

public class Test {
    
    public static void main(String[] args) throws Exception {
        
        File source = new File("d:/source.mp4");
        File target = new File("d:/target.mp4");
        
        System.out.println("源视频信息");
        MultimediaObject object = new MultimediaObject(source);
        MultimediaInfo info = object.getInfo();
        System.out.println("格式format:" + info.getFormat());
        System.out.println("时长duration:" + info.getDuration());
        VideoInfo videoInfo = info.getVideo();
        System.out.println("编码decoder:" + videoInfo.getDecoder());
        System.out.println("码率bitRate:" + videoInfo.getBitRate());
        System.out.println("帧率frameRate:" + videoInfo.getFrameRate());
        VideoSize videoSize = videoInfo.getSize();
        System.out.println("分辨率:" + videoSize.getWidth() + " x " + videoSize.getHeight());
        AudioInfo audioInfo = info.getAudio();
        System.out.println("编码decoder:" + audioInfo.getDecoder());
        System.out.println("码率bitRate:" + audioInfo.getBitRate());
        System.out.println("声道channels:" + audioInfo.getChannels());
        System.out.println("采样率samplingRate:" + audioInfo.getSamplingRate());
        
        // 视频属性
        VideoAttributes video = new VideoAttributes();
        video.setCodec("libx264");
        video.setBitRate(256000); // 码率:256kbps
        video.setFrameRate(25); // 帧率:25fps
        int width = 640; // 固定宽度
        int height = width * videoSize.getHeight() / videoSize.getWidth();
        height = height%2==0 ? height : height+1; // 视频宽高必须是偶数
        video.setSize(new VideoSize(width, height));
        // 音频属性
        AudioAttributes audio = new AudioAttributes();
        audio.setCodec("aac");
        audio.setBitRate(64000); // 码率:64kbps
        audio.setSamplingRate(24000); // 采样率:24kHz
        // 转码属性
        EncodingAttributes attributes = new EncodingAttributes();
        attributes.setVideoAttributes(video);
        attributes.setAudioAttributes(audio);
        attributes.setFormat("mp4");

        Encoder encoder = new Encoder();
        encoder.encode(object, target, attributes);
        
        System.out.println("转码完成:新分辨率:" + width + " x " + height);
    }
    
}

测试结果

源视频信息
格式format:mov
时长duration:268280
编码decoder:h264 (Main) (avc1 / 0x31637661)
码率bitRate:500000
帧率frameRate:25.0
分辨率:768 x 432
编码decoder:aac (LC) (mp4a / 0x6134706D)
码率bitRate:96000
声道channels:2
采样率samplingRate:44100

转码完成:新分辨率:640 x 360
文章标签: Java
推荐指数:

真诚点赞 诚不我欺~

如何优雅的用java实现视频转码

点赞 收藏 评论

关于作者

青苗
青苗

青苗幼儿园园长

等级 LV5

粉丝 20

获赞 47

经验 1182