视频压缩(记录)

视频压缩与哪里首先会再本地存储临时文件进行压缩

注意事项 

ws.schild.jave.EncoderException: Exit code of ffmpeg encoding run is 1

那个报错 原因就是source和target不能同时指向一个文件

所以传的这个picName 随便给个名就可以不能重复注意文件名后缀

引用依赖

         <dependency>
            <groupId>ws.schild</groupId>
            <artifactId>jave-core</artifactId>
            <version>3.0.0</version>
        </dependency>

        <!-- 在windows上开发 开发机可实现压缩效果 window64位 -->
        <dependency>
            <groupId>ws.schild</groupId>
            <artifactId>jave-nativebin-win64</artifactId>
            <version>3.0.0</version>
        </dependency>


        <!-- 在linux上部署 linux服务器需要这个才能生效 linux64位 -->
        <dependency>
            <groupId>ws.schild</groupId>
            <artifactId>jave-nativebin-linux64</artifactId>
            <version>3.0.0</version>
        </dependency>

import lombok.extern.log4j.Log4j2;
import org.apache.http.entity.ContentType;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.multipart.MultipartFile;
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.info.AudioInfo;
import ws.schild.jave.info.VideoSize;

import java.io.*;
import java.math.BigDecimal;
import java.net.HttpURLConnection;
import java.net.URL;

@Log4j2
public class FileUtils {

	/**
	 * 传视频File对象,返回压缩后File对象信息
	 *
	 * @param source
	 */
	public static File compressionVideo(File source, String picName) {
		if (source == null) {
			return null;
		}
		String newPath = source.getAbsolutePath().substring(0, source.getAbsolutePath().lastIndexOf(File.separator)).concat(File.separator).concat(picName).concat(".mp4");
		File target = new File(newPath);
		try {
			MultimediaObject object = new MultimediaObject(source);
			AudioInfo audioInfo = object.getInfo().getAudio();
			// 根据视频大小来判断是否需要进行压缩,
			int maxSize = 15;
			double mb = Math.ceil(source.length() / 1048576);
			int second = (int) object.getInfo().getDuration() / 1000;
			BigDecimal bd = new BigDecimal(String.format("%.4f", mb / second));
			System.out.println("开始压缩视频了--> 视频每秒平均 " + bd + " MB ");
			// 视频 > 5MB, 或者每秒 > 0.5 MB 才做压缩, 不需要的话可以把判断去掉
			boolean temp = mb > maxSize || bd.compareTo(new BigDecimal(0.5)) > 0;
//            if(temp){
			long time = System.currentTimeMillis();
			//TODO 视频属性设置
			int maxBitRate = 128000;
			int maxSamplingRate = 44100;
			int bitRate = 800000;
			int maxFrameRate = 20;
			int maxWidth = 1280;

			AudioAttributes audio = new AudioAttributes();
			// 设置通用编码格式10                   audio.setCodec("aac");
			// 设置最大值:比特率越高,清晰度/音质越好
			// 设置音频比特率,单位:b (比特率越高,清晰度/音质越好,当然文件也就越大 128000 = 182kb)
			if (audioInfo.getBitRate() > maxBitRate) {
				audio.setBitRate(new Integer(maxBitRate));
			}

			// 设置重新编码的音频流中使用的声道数(1 =单声道,2 = 双声道(立体声))。如果未设置任何声道值,则编码器将选择默认值 0。
			audio.setChannels(audioInfo.getChannels());
			// 采样率越高声音的还原度越好,文件越大
			// 设置音频采样率,单位:赫兹 hz
			// 设置编码时候的音量值,未设置为0,如果256,则音量值不会改变
			// audio.setVolume(256);
			if (audioInfo.getSamplingRate() > maxSamplingRate) {
				audio.setSamplingRate(maxSamplingRate);
			}

			//TODO 视频编码属性配置
			ws.schild.jave.info.VideoInfo videoInfo = object.getInfo().getVideo();
			VideoAttributes video = new VideoAttributes();
			video.setCodec("h264");
			//设置音频比特率,单位:b (比特率越高,清晰度/音质越好,当然文件也就越大 800000 = 800kb)
			if (videoInfo.getBitRate() > bitRate) {
				video.setBitRate(bitRate);
			}

			// 视频帧率:15 f / s  帧率越低,效果越差
			// 设置视频帧率(帧率越低,视频会出现断层,越高让人感觉越连续),视频帧率(Frame rate)是用于测量显示帧数的量度。所谓的测量单位为每秒显示帧数(Frames per Second,简:FPS)或“赫兹”(Hz)。
			if (videoInfo.getFrameRate() > maxFrameRate) {
				video.setFrameRate(maxFrameRate);
			}

			// 限制视频宽高
			int width = videoInfo.getSize().getWidth();
			int height = videoInfo.getSize().getHeight();
			if (width > maxWidth) {
				float rat = (float) width / maxWidth;
				video.setSize(new VideoSize(maxWidth, (int) (height / rat)));
			}

			EncodingAttributes attr = new EncodingAttributes();
//                attr.setFormat("mp4");
			attr.setAudioAttributes(audio);
			attr.setVideoAttributes(video);

			// 速度最快的压缩方式, 压缩速度 从快到慢: ultrafast, superfast, veryfast, faster, fast, medium,  slow, slower, veryslow and placebo.
//                attr.setPreset(PresetUtil.VERYFAST);
//                attr.setCrf(27);
//                // 设置线程数
//                attr.setEncodingThreads(Runtime.getRuntime().availableProcessors()/2);

			Encoder encoder = new Encoder();
			MultimediaObject multimediaObject = new MultimediaObject(source);
			encoder.encode(multimediaObject, target, attr);
			System.out.println("压缩总耗时:" + (System.currentTimeMillis() - time) / 1000);
			return target;
//            }
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (target.length() > 0) {
				source.delete();
			}
		}
		return source;
	}
}

视频格式转换方法类

import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;

/**
 * @author Hcg
 */
public class MultipartFileAndFileUtils {
    /**
     * MultipartFile 转 File
     *
     * @param file
     * @throws Exception
     */
    public static File multipartFileToFile(MultipartFile file) throws Exception {

        File toFile = null;
        if (file.equals("") || file.getSize() <= 0) {
            file = null;
        } else {
            InputStream ins = null;
            ins = file.getInputStream();
            toFile = new File(file.getOriginalFilename());
            inputStreamToFile(ins, toFile);
            ins.close();
        }
        return toFile;
    }

    /**
     *  File 转 MultipartFile
     *
     * @param file
     * @throws Exception
     */
    public static MultipartFile fileToMultipartFile(File file) throws Exception {
        InputStream inputStream = new FileInputStream(file);
        MultipartFile multipartFile = new MockMultipartFile(file.getName(), file.getName(),"application/octet-stream", inputStream);
        return multipartFile;
    }

    //获取流文件
    private static void inputStreamToFile(InputStream ins, File file) {
        try {
            OutputStream os = new FileOutputStream(file);
            int bytesRead = 0;
            byte[] buffer = new byte[8192];
            while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
            os.close();
            ins.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 删除本地临时文件
     * @param file
     */
    public static void delteTempFile(File file) {
        if (file != null) {
            File del = new File(file.toURI());
            del.delete();
        }
    }
}

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值