From 7fb751e5073d59b2d0d8d8fbc528cfc02ff09002 Mon Sep 17 00:00:00 2001 From: pnoker Date: Wed, 26 Jun 2019 23:47:25 +0800 Subject: [PATCH] feat(driver): add WIA data service, controller, and receive thread in dc3-group --- .../center/dbs/controller/RtmpController.java | 12 +++ .../center/dbs/service/RtmpService.java | 2 + .../dbs/service/impl/RtmpServiceImpl.java | 5 ++ .../pnoker/common/base/BaseController.java | 5 +- .../com/pnoker/device/group/bean/Global.java | 13 ---- .../group/controller/WiaDataController.java | 56 ++++++++++++++ .../pnoker/device/group/global/Queues.java | 73 ++++++++++++++++++ .../group/mapper/wia/WiaDataMapper.java | 15 ++++ .../device/group/model/wia/WiaData.java | 17 ++++ .../model/wia/{Device.java => WiaDevice.java} | 2 +- .../wia/{Gataway.java => WiaGataway.java} | 2 +- .../group/service/wia/WiaDataService.java | 38 +++++++++ .../service/wia/impl/WiaDataServiceImpl.java | 47 +++++++++++ .../device/group/thread/ReceiveThread.java | 32 ++++++++ .../device/group/thread/WiaReceiveThread.java | 19 +++++ .../src/main/resources/application.yml | 4 +- .../src/main/resources/sqlite/dc3-group.db | Bin 77824 -> 77824 bytes .../src/main/resources/application.yml | 2 +- dc3/readme/ffmpeg.md | 72 +++++++++++++++++ pom.xml | 2 +- 20 files changed, 396 insertions(+), 22 deletions(-) delete mode 100644 dc3-device/dc3-group/src/main/java/com/pnoker/device/group/bean/Global.java create mode 100644 dc3-device/dc3-group/src/main/java/com/pnoker/device/group/controller/WiaDataController.java create mode 100644 dc3-device/dc3-group/src/main/java/com/pnoker/device/group/global/Queues.java create mode 100644 dc3-device/dc3-group/src/main/java/com/pnoker/device/group/mapper/wia/WiaDataMapper.java create mode 100644 dc3-device/dc3-group/src/main/java/com/pnoker/device/group/model/wia/WiaData.java rename dc3-device/dc3-group/src/main/java/com/pnoker/device/group/model/wia/{Device.java => WiaDevice.java} (93%) rename dc3-device/dc3-group/src/main/java/com/pnoker/device/group/model/wia/{Gataway.java => WiaGataway.java} (93%) create mode 100644 dc3-device/dc3-group/src/main/java/com/pnoker/device/group/service/wia/WiaDataService.java create mode 100644 dc3-device/dc3-group/src/main/java/com/pnoker/device/group/service/wia/impl/WiaDataServiceImpl.java create mode 100644 dc3-device/dc3-group/src/main/java/com/pnoker/device/group/thread/ReceiveThread.java create mode 100644 dc3-device/dc3-group/src/main/java/com/pnoker/device/group/thread/WiaReceiveThread.java create mode 100644 dc3/readme/ffmpeg.md diff --git a/dc3-center/dc3-dbs/src/main/java/com/pnoker/center/dbs/controller/RtmpController.java b/dc3-center/dc3-dbs/src/main/java/com/pnoker/center/dbs/controller/RtmpController.java index 9aadcb024..9062e97b6 100644 --- a/dc3-center/dc3-dbs/src/main/java/com/pnoker/center/dbs/controller/RtmpController.java +++ b/dc3-center/dc3-dbs/src/main/java/com/pnoker/center/dbs/controller/RtmpController.java @@ -8,6 +8,7 @@ import com.pnoker.transfer.rtmp.feign.RtmpFeignApi; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; @@ -53,4 +54,15 @@ public class RtmpController extends BaseController implements RtmpFeignApi { List list = rtmpService.list(queryWrapper); return list; } + + @RequestMapping("/insert") + public void insert() { + for (int i = 0; i < 1000000; i++) { + Rtmp wiaData = new Rtmp(i); + rtmpService.insert(wiaData); + if (i % 100 == 0) { + log.info("完成:{},{}%", i, i / 1000000 * 10); + } + } + } } diff --git a/dc3-center/dc3-dbs/src/main/java/com/pnoker/center/dbs/service/RtmpService.java b/dc3-center/dc3-dbs/src/main/java/com/pnoker/center/dbs/service/RtmpService.java index 79f6daa7f..e4baad6ed 100644 --- a/dc3-center/dc3-dbs/src/main/java/com/pnoker/center/dbs/service/RtmpService.java +++ b/dc3-center/dc3-dbs/src/main/java/com/pnoker/center/dbs/service/RtmpService.java @@ -33,4 +33,6 @@ public interface RtmpService { * @return */ List list(Wrapper wrapper); + + int insert(Rtmp rtmp); } diff --git a/dc3-center/dc3-dbs/src/main/java/com/pnoker/center/dbs/service/impl/RtmpServiceImpl.java b/dc3-center/dc3-dbs/src/main/java/com/pnoker/center/dbs/service/impl/RtmpServiceImpl.java index a5f9ea923..57728472f 100644 --- a/dc3-center/dc3-dbs/src/main/java/com/pnoker/center/dbs/service/impl/RtmpServiceImpl.java +++ b/dc3-center/dc3-dbs/src/main/java/com/pnoker/center/dbs/service/impl/RtmpServiceImpl.java @@ -39,4 +39,9 @@ public class RtmpServiceImpl implements RtmpService { public List list(Wrapper wrapper) { return rtmpMapper.selectList(wrapper); } + + @Override + public int insert(Rtmp rtmp) { + return rtmpMapper.insert(rtmp); + } } diff --git a/dc3-common/src/main/java/com/pnoker/common/base/BaseController.java b/dc3-common/src/main/java/com/pnoker/common/base/BaseController.java index 33ff6af1a..59a0c8494 100644 --- a/dc3-common/src/main/java/com/pnoker/common/base/BaseController.java +++ b/dc3-common/src/main/java/com/pnoker/common/base/BaseController.java @@ -40,8 +40,7 @@ public class BaseController { * @return */ protected HttpServletRequest getRequest() { - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); - return request; + return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); } /** @@ -55,7 +54,7 @@ public class BaseController { try { path = URLDecoder.decode(path, "UTF-8") + resource; } catch (UnsupportedEncodingException e) { - log.error("BaseController.getResourcePath.error {}", e.getMessage(), e); + log.error(e.getMessage(), e); } return path; } diff --git a/dc3-device/dc3-group/src/main/java/com/pnoker/device/group/bean/Global.java b/dc3-device/dc3-group/src/main/java/com/pnoker/device/group/bean/Global.java deleted file mode 100644 index 0ec25d0c8..000000000 --- a/dc3-device/dc3-group/src/main/java/com/pnoker/device/group/bean/Global.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.pnoker.device.group.bean; - -import java.util.concurrent.LinkedBlockingQueue; - -/** - *

Copyright(c) 2018. Pnoker All Rights Reserved. - *

Author : Pnoker - *

Email : pnokers@gmail.com - *

Description: - */ -public class Global { - public static LinkedBlockingQueue wiaReceiveThreadQueue = new LinkedBlockingQueue(20); -} diff --git a/dc3-device/dc3-group/src/main/java/com/pnoker/device/group/controller/WiaDataController.java b/dc3-device/dc3-group/src/main/java/com/pnoker/device/group/controller/WiaDataController.java new file mode 100644 index 000000000..ff9fabefb --- /dev/null +++ b/dc3-device/dc3-group/src/main/java/com/pnoker/device/group/controller/WiaDataController.java @@ -0,0 +1,56 @@ +package com.pnoker.device.group.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.pnoker.common.base.BaseController; +import com.pnoker.device.group.model.wia.WiaData; +import com.pnoker.device.group.service.wia.WiaDataService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.concurrent.LinkedBlockingQueue; + +/** + *

Copyright(c) 2018. Pnoker All Rights Reserved. + *

Author : Pnoker + *

Email : pnokers@gmail.com + *

Description: + */ +@Slf4j +@RestController +public class WiaDataController extends BaseController { + @Autowired + private WiaDataService wiaDataService; + + @RequestMapping("/list") + public List list() { + QueryWrapper queryWrapper = new QueryWrapper<>(); + List list = wiaDataService.list(queryWrapper); + return list.subList(0, 100); + } + + @Transactional + @RequestMapping("/insert/{num}") + public String insert(@PathVariable int num) { + LinkedBlockingQueue blockingQueue = new LinkedBlockingQueue(5000); + if(blockingQueue.size()>1000){ + + } + long start = System.currentTimeMillis(); + for (int i = 0; i < num; i++) { + WiaData wiaData = new WiaData(); + wiaData.setId(i); + wiaData.setVariableId(0); + wiaData.setValue(1); + wiaData.setTime(System.currentTimeMillis()); + wiaDataService.insert(wiaData); + log.info("完成:{}", i); + } + long end = System.currentTimeMillis(); + return ((end - start) / 1000) + ""; + } +} diff --git a/dc3-device/dc3-group/src/main/java/com/pnoker/device/group/global/Queues.java b/dc3-device/dc3-group/src/main/java/com/pnoker/device/group/global/Queues.java new file mode 100644 index 000000000..f9cbe71d6 --- /dev/null +++ b/dc3-device/dc3-group/src/main/java/com/pnoker/device/group/global/Queues.java @@ -0,0 +1,73 @@ +package com.pnoker.device.group.global; + +import com.pnoker.device.group.model.wia.WiaData; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicInteger; + +/** + *

Copyright(c) 2018. Pnoker All Rights Reserved. + *

Author : Pnoker + *

Email : pnokers@gmail.com + *

Description: 全局 队列集合和线程池,用于存放线程队列、数据队列以及线程池 + */ +@Slf4j +public class Queues { + /** + * 核心线程池大小 + */ + public static int corePoolSize = 4; + + /** + * 最大线程池大小 + */ + public static int maximumPoolSize = 32; + + /** + * 线程最大空闲时间 + */ + public static long keepAliveTime = 10; + + /** + * 时间单位,秒 + */ + public static TimeUnit unit = TimeUnit.SECONDS; + + /** + * 用于存放 wia 数据,支持2000并发,该队列用于优化大批量数据入库性能 + */ + public static LinkedBlockingQueue wiaDataQueue = new LinkedBlockingQueue(2000); + + /** + * 用于存放 wia 数据采集线程,为了性能,最多一次性放入32个 + */ + public static LinkedBlockingQueue wiaReceiveThreadQueue = new LinkedBlockingQueue(32); + + /** + * 数据采集线程池,用于全部数采线程使用 + */ + public static ThreadPoolExecutor receivePoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, wiaReceiveThreadQueue, new ReceiveTreadFactory(), new IgnorePolicy()); + + static class ReceiveTreadFactory implements ThreadFactory { + private final AtomicInteger mThreadNum = new AtomicInteger(1); + + @Override + public Thread newThread(Runnable runnable) { + Thread thread = new Thread(runnable, "dc3-group-thread-" + mThreadNum.getAndIncrement()); + log.info("{} has been created", thread.getName()); + return thread; + } + } + + static class IgnorePolicy implements RejectedExecutionHandler { + public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { + doLog(r, e); + } + + private void doLog(Runnable r, ThreadPoolExecutor e) { + log.error("{} rejected,completedTaskCount:{}", r.toString(), e.getCompletedTaskCount()); + } + } + +} diff --git a/dc3-device/dc3-group/src/main/java/com/pnoker/device/group/mapper/wia/WiaDataMapper.java b/dc3-device/dc3-group/src/main/java/com/pnoker/device/group/mapper/wia/WiaDataMapper.java new file mode 100644 index 000000000..546e1670c --- /dev/null +++ b/dc3-device/dc3-group/src/main/java/com/pnoker/device/group/mapper/wia/WiaDataMapper.java @@ -0,0 +1,15 @@ +package com.pnoker.device.group.mapper.wia; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.pnoker.device.group.model.wia.WiaData; +import org.apache.ibatis.annotations.Mapper; + +/** + *

Copyright(c) 2018. Pnoker All Rights Reserved. + *

Author : Pnoker + *

Email : pnokers@gmail.com + *

Description: Wia数据 数据库操作接口 + */ +@Mapper +public interface WiaDataMapper extends BaseMapper { +} diff --git a/dc3-device/dc3-group/src/main/java/com/pnoker/device/group/model/wia/WiaData.java b/dc3-device/dc3-group/src/main/java/com/pnoker/device/group/model/wia/WiaData.java new file mode 100644 index 000000000..7239d69c5 --- /dev/null +++ b/dc3-device/dc3-group/src/main/java/com/pnoker/device/group/model/wia/WiaData.java @@ -0,0 +1,17 @@ +package com.pnoker.device.group.model.wia; + +import lombok.Data; + +/** + *

Copyright(c) 2018. Pnoker All Rights Reserved. + *

Author : Pnoker + *

Email : pnokers@gmail.com + *

Description: + */ +@Data +public class WiaData { + private long id; + private long variableId; + private float value; + private long time; +} diff --git a/dc3-device/dc3-group/src/main/java/com/pnoker/device/group/model/wia/Device.java b/dc3-device/dc3-group/src/main/java/com/pnoker/device/group/model/wia/WiaDevice.java similarity index 93% rename from dc3-device/dc3-group/src/main/java/com/pnoker/device/group/model/wia/Device.java rename to dc3-device/dc3-group/src/main/java/com/pnoker/device/group/model/wia/WiaDevice.java index 542a28728..4a5a4a4ad 100644 --- a/dc3-device/dc3-group/src/main/java/com/pnoker/device/group/model/wia/Device.java +++ b/dc3-device/dc3-group/src/main/java/com/pnoker/device/group/model/wia/WiaDevice.java @@ -9,7 +9,7 @@ import lombok.Data; *

Description: Wia 数采设备信息 */ @Data -public class Device { +public class WiaDevice { private long id; private long gatewayId; private String name; diff --git a/dc3-device/dc3-group/src/main/java/com/pnoker/device/group/model/wia/Gataway.java b/dc3-device/dc3-group/src/main/java/com/pnoker/device/group/model/wia/WiaGataway.java similarity index 93% rename from dc3-device/dc3-group/src/main/java/com/pnoker/device/group/model/wia/Gataway.java rename to dc3-device/dc3-group/src/main/java/com/pnoker/device/group/model/wia/WiaGataway.java index 0607bb1a0..b49480c8c 100644 --- a/dc3-device/dc3-group/src/main/java/com/pnoker/device/group/model/wia/Gataway.java +++ b/dc3-device/dc3-group/src/main/java/com/pnoker/device/group/model/wia/WiaGataway.java @@ -9,7 +9,7 @@ import lombok.Data; *

Description: Wia 网关设备信息 */ @Data -public class Gataway { +public class WiaGataway { private long id; private String ipAddress; private int port; diff --git a/dc3-device/dc3-group/src/main/java/com/pnoker/device/group/service/wia/WiaDataService.java b/dc3-device/dc3-group/src/main/java/com/pnoker/device/group/service/wia/WiaDataService.java new file mode 100644 index 000000000..3e6f21987 --- /dev/null +++ b/dc3-device/dc3-group/src/main/java/com/pnoker/device/group/service/wia/WiaDataService.java @@ -0,0 +1,38 @@ +/* + * Copyright 2018 Google LLC. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.pnoker.device.group.service.wia; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.pnoker.device.group.model.wia.WiaData; + +import java.util.List; + +/** + *

Copyright(c) 2018. Pnoker All Rights Reserved. + *

Author : Pnoker + *

Email : pnokers@gmail.com + *

Description: Rtmp 服务接口 + */ +public interface WiaDataService { + /** + * 获取 Rtmp任务 数据列表 + * + * @return + */ + List list(Wrapper wrapper); + + int insert(WiaData wiaData); +} diff --git a/dc3-device/dc3-group/src/main/java/com/pnoker/device/group/service/wia/impl/WiaDataServiceImpl.java b/dc3-device/dc3-group/src/main/java/com/pnoker/device/group/service/wia/impl/WiaDataServiceImpl.java new file mode 100644 index 000000000..fd7df5b81 --- /dev/null +++ b/dc3-device/dc3-group/src/main/java/com/pnoker/device/group/service/wia/impl/WiaDataServiceImpl.java @@ -0,0 +1,47 @@ +/* + * Copyright 2018 Google LLC. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.pnoker.device.group.service.wia.impl; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.pnoker.device.group.mapper.wia.WiaDataMapper; +import com.pnoker.device.group.model.wia.WiaData; +import com.pnoker.device.group.service.wia.WiaDataService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *

Copyright(c) 2018. Pnoker All Rights Reserved. + *

Author : Pnoker + *

Email : pnokers@gmail.com + *

Description: Rtmp 接口实现 + */ +@Service +public class WiaDataServiceImpl implements WiaDataService { + @Autowired + private WiaDataMapper wiaDataMapper; + + @Override + public List list(Wrapper wrapper) { + return wiaDataMapper.selectList(wrapper); + } + + @Override + public int insert(WiaData wiaData) { + return wiaDataMapper.insert(wiaData); + } +} diff --git a/dc3-device/dc3-group/src/main/java/com/pnoker/device/group/thread/ReceiveThread.java b/dc3-device/dc3-group/src/main/java/com/pnoker/device/group/thread/ReceiveThread.java new file mode 100644 index 000000000..e3ecd8bea --- /dev/null +++ b/dc3-device/dc3-group/src/main/java/com/pnoker/device/group/thread/ReceiveThread.java @@ -0,0 +1,32 @@ +package com.pnoker.device.group.thread; + +/** + *

Copyright(c) 2018. Pnoker All Rights Reserved. + *

Author : Pnoker + *

Email : pnokers@gmail.com + *

Description: 数据采集线程基类,数采线程请务必继承此类 + */ +public class ReceiveThread implements Runnable { + /** + * 线程名称,建议写明白 + */ + private String name; + + public ReceiveThread(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + @Override + public void run() { + + } + + @Override + public String toString() { + return "ReceiveThread [name=" + name + "]"; + } +} diff --git a/dc3-device/dc3-group/src/main/java/com/pnoker/device/group/thread/WiaReceiveThread.java b/dc3-device/dc3-group/src/main/java/com/pnoker/device/group/thread/WiaReceiveThread.java new file mode 100644 index 000000000..4022ff022 --- /dev/null +++ b/dc3-device/dc3-group/src/main/java/com/pnoker/device/group/thread/WiaReceiveThread.java @@ -0,0 +1,19 @@ +package com.pnoker.device.group.thread; + +/** + *

Copyright(c) 2018. Pnoker All Rights Reserved. + *

Author : Pnoker + *

Email : pnokers@gmail.com + *

Description: wia 数据采集线程 + */ +public class WiaReceiveThread extends ReceiveThread { + + public WiaReceiveThread(String name) { + super(name); + } + + @Override + public void run() { + + } +} diff --git a/dc3-device/dc3-group/src/main/resources/application.yml b/dc3-device/dc3-group/src/main/resources/application.yml index 65ae7f1b3..192008d4c 100644 --- a/dc3-device/dc3-group/src/main/resources/application.yml +++ b/dc3-device/dc3-group/src/main/resources/application.yml @@ -6,10 +6,10 @@ server: io-threads: 2 spring: application: - name: dc3-group + name: dc3-device-group datasource: driver-class-name: org.sqlite.JDBC - url: jdbc:sqlite::resource:sqlite/dc3-group.sqlite + url: jdbc:sqlite::resource:sqlite/dc3-group.db username: password: sql-script-encoding: utf-8 diff --git a/dc3-device/dc3-group/src/main/resources/sqlite/dc3-group.db b/dc3-device/dc3-group/src/main/resources/sqlite/dc3-group.db index 0f093fd7fa0a526cc3c8d2672fbb1981ee49c393..b4aa6873098e958d79c328fb827c11bfde05e0cb 100644 GIT binary patch literal 77824 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 diff --git a/dc3-device/dc3-manager/src/main/resources/application.yml b/dc3-device/dc3-manager/src/main/resources/application.yml index 0a4483e56..9aa32029a 100644 --- a/dc3-device/dc3-manager/src/main/resources/application.yml +++ b/dc3-device/dc3-manager/src/main/resources/application.yml @@ -6,7 +6,7 @@ server: io-threads: 2 spring: application: - name: dc3-manager + name: dc3-device-manager management: endpoints: diff --git a/dc3/readme/ffmpeg.md b/dc3/readme/ffmpeg.md new file mode 100644 index 000000000..e5c5260dc --- /dev/null +++ b/dc3/readme/ffmpeg.md @@ -0,0 +1,72 @@ +### 剪切&合并视频 + +```bash +//截取从头开始的30s +ffmpeg -ss 00:00:00 -t 00:00:30 -i keyoutput.mp4 -vcodec copy -acodec copy split.mp4 +//截取从30s开始的30s +ffmpeg -ss 00:00:30 -t 00:00:30 -i keyoutput.mp4 -vcodec copy -acodec copy split1.mp4 +//进行视频的合并 +ffmpeg -f concat -i list.txt -c copy concat.mp4 +``` + +### 其他常见指令 + +```bash +// 去掉视频中的音频 +ffmpeg -i input.mp4 -vcodec copy -an output.mp4 +// -an: 去掉音频;-vcodec:视频选项,一般后面加copy表示拷贝 + +// 提取视频中的音频 +ffmpeg -i input.mp4 -acodec copy -vn output.mp3 +// -vn: 去掉视频;-acodec: 音频选项, 一般后面加copy表示拷贝 + +// 音视频合成 +ffmpeg -y –i input.mp4 –i input.mp3 –vcodec copy –acodec copy output.mp4 +// -y 覆盖输出文件 + +//剪切视频 +ffmpeg -ss 0:1:30 -t 0:0:20 -i input.mp4 -vcodec copy -acodec copy output.mp4 +// -ss 开始时间; -t 持续时间 + +// 视频截图 +ffmpeg –i test.mp4 –f image2 -t 0.001 -s 320x240 image-%3d.jpg +// -s 设置分辨率; -f 强迫采用格式fmt; + +// 视频分解为图片 +ffmpeg –i test.mp4 –r 1 –f image2 image-%3d.jpg +// -r 指定截屏频率 + +// 将图片合成视频 +ffmpeg -f image2 -i image%d.jpg output.mp4 + +//视频拼接 +ffmpeg -f concat -i filelist.txt -c copy output.mp4 + +// 将视频转为gif +ffmpeg -i input.mp4 -ss 0:0:30 -t 10 -s 320x240 -pix_fmt rgb24 output.gif +// -pix_fmt 指定编码 + +// 将视频前30帧转为gif +ffmpeg -i input.mp4 -vframes 30 -f gif output.gif + +// 旋转视频 +ffmpeg -i input.mp4 -vf rotate=PI/2 output.mp4 + +// 缩放视频 +ffmpeg -i input.mp4 -vf scale=iw/2:-1 output.mp4 +// iw 是输入的宽度, iw/2就是一半;-1 为保持宽高比 + +//视频变速 +ffmpeg -i input.mp4 -filter:v setpts=0.5*PTS output.mp4 + +//音频变速 +ffmpeg -i input.mp3 -filter:a atempo=2.0 output.mp3 + +//音视频同时变速,但是音视频为互倒关系 +ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mp4 + + +// 视频添加水印 +ffmpeg -i input.mp4 -i logo.jpg -filter_complex [0:v][1:v]overlay=main_w-overlay_w-10:main_h-overlay_h-10[out] -map [out] -map 0:a -codec:a copy output.mp4 +// main_w-overlay_w-10 视频的宽度-水印的宽度-水印边距; +``` \ No newline at end of file diff --git a/pom.xml b/pom.xml index 9ceb507ae..82ad4e09b 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ org.springframework.boot spring-boot-starter-parent - 2.1.5.RELEASE + 2.1.6.RELEASE