java实现的音视频格式转化器

news2024/11/28 10:54:59

一、前言
最近写了一款图形界面版的音视频格式转化器,可以实现将多种视频之间进行转化,非常好用,如将AVI转换为,TS,FLV,MP4等。音频可将MP3转成WAV。

二、实现
1.需引入相关maven依赖。

<!-- 核心包 -->
		<dependency>
   			 <groupId>ws.schild</groupId>
    		 <artifactId>jave-core</artifactId>
    		<version>3.4.0</version>
		</dependency>
		<!-- Windows64位 -->
		<dependency>
    		<groupId>ws.schild</groupId>
    		<artifactId>jave-nativebin-win64</artifactId>
    		<version>3.4.0</version>
		</dependency>

2.编写相关音视频格式转换代码,如下:

 public static ConvertResult audioToAudioConverter(File source, File target, String audioCodec,String outFormat) {
        ConvertResult result = new ConvertResult();
        try {
            result.setSuccess(true);
            //设置音频流的编码属性
            AudioAttributes audio = new AudioAttributes();
            //libmp3lame表示使用LAME MP3编码器。LAME是一个开源的MP3编码器,FFmpeg中的libmp3lame就是LAME的实现。
            if (Objects.nonNull(audioCodec) && !audioCodec.equals("")) {
                audio.setCodec(audioCodec);
            }
            if (Objects.isNull(audioCodec) || Objects.equals(audioCodec,"libmp3lame")) {
                //在MP3编码中,通常的比特率范围是64 kbps到320 kbps。推荐的范围是128 kbps到256 kbps。较低的比特率会导致音频质量下降,但文件大小更小。
                audio.setBitRate(128000);
                //1单声道,2立体声
                audio.setChannels(2);
                //设置音频的采样率为44100Hz。这是CD质量的音频的标准采样率。
                audio.setSamplingRate(44100);
            }else {
                if (Objects.equals(audioCodec,"libmp3lame")) {
                    //设置音频的采样率为44100Hz。这是CD质量的音频的标准采样率。
                    audio.setSamplingRate(44100);
                    //8BITS,16BTIS,24BTIS,32BTIS
                    audio.setBitRate(1411100); //对于16bit
                    audio.setChannels(2);
                }
            }

            EncodingAttributes attrs = new EncodingAttributes();
            if (Objects.nonNull(outFormat) && !outFormat.equals("")) {
                attrs.setOutputFormat(outFormat);
            }
            attrs.setAudioAttributes(audio);
            Encoder encoder = new Encoder();
            MultimediaObject multimediaObject = new MultimediaObject(source);
            encoder.encode(multimediaObject, target, attrs);
        }catch (Exception e) {
            result.setSuccess(false);
            result.setMessage(e.getMessage());
            System.err.println(e);
        }
        return result;
    }
    public static ConvertResult converterToWav(File source,File target) {
        //wav编码格式 pcm_s16le 指定输出音频编码为PCM 16位小端序,指定输出音频编码为PCM 16位大端序,s表示signed u表示unsigned
        return audioToAudioConverter(source,target,"pcm_s16le","wav");
    }
    .............................

3.编写图形界面。

public class AudioVideoConverter {
	private List<String> errorMsgList = new ArrayList<>();
	static JLabel videoConvertJl,audioConvertJl,videoText,audioText;
	static JPanel videoJPanel,audioJPanel;
	boolean videoFlag = true;
	boolean audioFlag = false;
	static {
		videoConvertJl = new JLabel(new ImageIcon(AudioVideoConverter.class.getResource("/image/videoConvert.png")));
		audioConvertJl = new JLabel(new ImageIcon(AudioVideoConverter.class.getResource("/image/videoConvert.png")));
		videoText = new JLabel("视频转换");
		audioText = new JLabel("音频转换");
		videoJPanel = new JPanel();
		audioJPanel = new JPanel();
		videoJPanel.setBounds(50,4,62,62);
		videoJPanel.setBackground(new Color(55,50,50));
		videoConvertJl.setBounds(50, 3, 60, 60);
		videoJPanel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
		videoJPanel.add(videoConvertJl);
		videoText.setBounds(60, 71, 60, 15);
		audioConvertJl.setBounds(160, 4, 60, 60);
		audioJPanel.setBounds(160, 3, 62, 62);
		audioJPanel.setBackground(null);
		audioJPanel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
		audioJPanel.add(audioConvertJl);
		audioText.setBounds(170, 71, 80, 15);

	}
	...............................
	public static void main( String[] args )
	{	

		JFrame frame=new JFrame();
		AudioVideoConverter converter=new AudioVideoConverter();
		//视频转换与音频转换切换
		JLabel jl=new JLabel("选择转换到的格式:");

		String[] items = {"MP4", "MKV", "AVI", "WMV","TS","FLV","3GP"};
	    final JComboBox<String> comboBox = new JComboBox<>(items);
	    comboBox.setEditable(false);
	    comboBox.setBounds(170, 105, 60, 20);
		final JComboBox<String> audioComboBox = converter.setAudioComboBox();
		JButton b=new JButton("选择文件");
		b.setHorizontalTextPosition(JButton.CENTER);
		//b.setBackground(new Color(195,17,17));
		b.setBorder(BorderFactory.createRaisedSoftBevelBorder());
		//去掉按钮文字周围的焦点框
		b.setFocusPainted(false);
		b.setBounds(240, 105, 80, 20);
		b.setVisible(true);
		jl.setBounds(50, 100, 150, 30);
		JTextArea area=new JTextArea(8,10);
		area.setBounds(50, 140, 550, 170);
		area.setBorder(BorderFactory.createLoweredSoftBevelBorder());
		area.setLineWrap(true);
		area.setVisible(true);
		area.setText("原视频地址\n");
		area.setEditable(false);

		JLabel jlPosition=new JLabel("保存位置:");
		jlPosition.setFont(new Font("宋体",Font.BOLD,14));
		jlPosition.setBounds(50, 320, 100, 30);
		ButtonGroup group = new ButtonGroup();
		JRadioButton option1 = new JRadioButton("保存在原视频相同位置");
		JRadioButton option2 = new JRadioButton("指定位置");
		group.add(option1);
		group.add(option2);
		// 默认选中第一个选项
		option1.setSelected(true);
		option1.setBackground(null);
		option2.setBackground(null);
		option1.setBounds(50, 360, 200, 20);
		option2.setBounds(50, 390, 80, 20);

		JTextField jt = new JTextField("");
		jt.setBounds(130, 390, 370, 20);
		JButton selectButton=new JButton("选择文件夹");
		selectButton.setHorizontalTextPosition(JButton.CENTER);
		selectButton.setBorder(BorderFactory.createRaisedSoftBevelBorder());
		//去掉按钮文字周围的焦点框
		selectButton.setFocusPainted(false);
		selectButton.setBounds(520, 390, 80, 20);
		selectButton.setVisible(true);
		selectButton.setEnabled(false);
		//开始转换
		JButton exchangeBt=new JButton("开始转换");
		exchangeBt.setHorizontalTextPosition(JButton.CENTER);
		exchangeBt.setBorder(BorderFactory.createRaisedSoftBevelBorder());
		//去掉按钮文字周围的焦点框
		exchangeBt.setFocusPainted(false);
		exchangeBt.setBounds(260, 470, 80, 20);
		exchangeBt.setVisible(true);

		frame.setSize(680, 600);
		frame.setTitle("音视频转换");
		frame.setLocationRelativeTo(null);
		// 创建一个ImageIcon对象
		ImageIcon icon = new ImageIcon(AudioVideoConverter.class.getResource("/image/videoAudioIcon.png"));
		// 调整图标大小
		Image image = icon.getImage(); // 获取原始图像
		Image newImage = image.getScaledInstance(16, 16, Image.SCALE_SMOOTH); // 设置新的大小,这里是16x16像素
		icon.setImage(newImage); // 设置调整大小后的图像
		frame.setIconImage(newImage);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
		Container c=frame.getContentPane();
		c.setLayout(null);
		c.add(videoJPanel);
		c.add(videoText);
		c.add(audioJPanel);
		c.add(audioText);
		c.add(area);
		c.add(jl);
		c.add(jlPosition);
		c.add(comboBox);
		c.add(audioComboBox);
		c.add(option1);
		c.add(option2);
		c.add(jt);
		c.add(b);
		c.add(selectButton);
		c.add(exchangeBt);
.............................
//converter.processLoadingAction(exchangeBt,frame,b,selectButton,fileList,comboBox,jt,option1,option2,audioComboBox);
		c.setBackground(new Color(222,184,135));
	}
	

接着启动main方法接口了。

效果如下:
在这里插入图片描述
完整代码如下:
java swing实现音视频转换器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2227596.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java知识巩固(十二)

I/O JavaIO流了解吗&#xff1f; IO 即 Input/Output&#xff0c;输入和输出。数据输入到计算机内存的过程即输入&#xff0c;反之输出到外部存储&#xff08;比如数据库&#xff0c;文件&#xff0c;远程主机&#xff09;的过程即输出。数据传输过程类似于水流&#xff0c;因…

1.3 面向对象 C++面试问题

1.3.1 简述一下什么是面向对象,面向对象与面向过程的区别 什么是面向对象 面向对象&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09;是一种编程范式&#xff0c;它通过将现实世界中的实体抽象为“对象”来组织代码。面向对象编程关注对象及其交互&#x…

Visual Studio Code

代码自动保存 打开设置搜索auto save&#xff0c;设置为afterDelay 设置延迟时间&#xff0c;单位是毫秒 启用Ctrl鼠标滚轮对字体进行缩放 搜索Mouse Wheel Zoom&#xff0c;把该选项勾选上即可 Python插件 运行和调试Python

Hash表算法

哈希表 理论知识&#xff08;本文来自于代码随想录摘抄&#xff09;什么是哈希常见的三种哈希结数组&#xff1a;set:map:其他常用方法或者技巧&#xff08;自己总结的&#xff09; 练习题和讲解有效的字母移位词349. 两个数组的交集1. 两数之和454. 四数相加 II15. 三数之和 总…

广泛的四款录屏工具专业软件解析!!!

当代社会的进步&#xff0c;电脑、手机等数码产品的普及&#xff0c;改变了我们的沟通形式&#xff0c;只需要动动手指&#xff0c;就能实现视频连接&#xff0c;影像播放等。有时候就需要我们录屏留存。在市面上的录屏软件种类繁多&#xff0c;从简洁易用的小工具到功能丰富的…

通俗直观介绍ChatGPT背后的大语言模型理论知识

“AI 的 iPhone 时刻到来了”。非算法岗位的研发同学’被迫’学习 AI&#xff0c;产品岗位的同学希望了解 AI。但是&#xff0c;很多自媒体文章要么太严谨、科学&#xff0c;让非科班出身的同学读不懂&#xff1b;要么&#xff0c;写成了科幻文章&#xff0c;很多结论都没有充分…

力扣21 : 合并两个有序链表

链表style 描述&#xff1a; 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例&#xff1a; 节点大小相同时&#xff0c;l1的节点在前 何解&#xff1f; 1&#xff0c;遍历两个链表&#xff0c;挨个比较节点大小 同时遍…

MATLAB——入门知识

内容源于b站清风数学建模 目录 1.帮助文档 2.注释 3.特殊字符 4.设置MATLAB数值显示格式 4.1.临时更改 4.2.永久改 5.常用函数 6.易错点 1.帮助文档 doc sum help sum edit sum 2.注释 ctrl R/T 3.特殊字符 4.设置MATLAB数值显示格式 4.1.临时更改 format lon…

LCR 024. 反转链表 最细图片逐行解析过程

LCR 024. 反转链表 给定单链表的头节点 head &#xff0c;请反转链表&#xff0c;并返回反转后的链表的头节点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示例…

【JavaEE】【多线程】定时器

目录 一、定时器简介1.1 Timer类1.2 使用案例 二、实现简易定时器2.1 MyTimerTask类2.2 实现schedule方法2.3 构造方法2.4 总代码2.5 测试 一、定时器简介 定时器&#xff1a;就相当于一个闹钟&#xff0c;当我们定的时间到了&#xff0c;那么就执行一些逻辑。 1.1 Timer类 …

TVM前端研究--Relay

文章目录 深度学习IR梳理1. IR属性2. DL前端发展3. DL编译器4. DL编程语言Relay的主要内容一、Expression in Relay1. Dataflow and Control Fragments2. 变量3. 函数3.1 闭包3.2 多态和类型关系3.3. Call4. 算子5. ADT Constructors6. Moudle和Global Function7. 常量和元组8.…

SSL/TLS 密码套件漏洞分析以及修复方法

1. 前言 在当今数字化时代&#xff0c;网络安全至关重要。SSL/TLS 协议作为保障网络通信安全的重要手段&#xff0c;广泛应用于各类网络应用中。然而&#xff0c;如同任何技术一样&#xff0c;SSL/TLS 也并非绝对安全&#xff0c;存在着一些可能被攻击者利用的漏洞。本文将深入…

stm32入门教程--DMA 超详细!!!

目录 简介 工作模式 1、数据转运DMA 2、ADC扫描模式DMA 简介 工作模式 1、数据转运DMA 这个例子的任务是将SRAM的数组DataA&#xff0c;转运到另一个数组DataB中&#xff0c;这个基本结构里的各个参数应该如何配置呢&#xff1f; 首先是外设站点和存储器站点的起始地址、…

大数据新视界 -- 大数据大厂之大数据重塑影视娱乐产业的未来(4 - 3)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

TIFS-2024 细粒度表示和重组在换衣行人重识别中的应用

总体结论 本文提出了一种新的细粒度表示与重构&#xff08;FIRe2&#xff09;框架&#xff0c;用于解决布变人重识别问题。通过细粒度特征挖掘和属性重构&#xff0c;FIRe2在不依赖任何辅助信息的情况下&#xff0c;实现了最先进的性能。该方法在多个基准数据集上取得了显著的…

基于JSP的篮球系列网上商城系统【附源码】

基于JSP的篮球系列网上商城系统 效果如下&#xff1a; 系统首页界面 商品信息界面 购物车界面 购物车界面 管理员登录界面 管理员功能界面 用户注册界面 我的收藏界面 研究背景 21世纪&#xff0c;我国早在上世纪就已普及互联网信息&#xff0c;互联网对人们生活中带来了无限…

重学SpringBoot3-怎样优雅停机

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-怎样优雅停机 1. 什么是优雅停机&#xff1f;2. Spring Boot 3 优雅停机的配置3. Tomcat 和 Reactor Netty 的优雅停机机制3.1 Tomcat 优雅停机3.2 Reac…

MySQL 数据库备份与恢复全攻略

MySQL 数据库备份与恢复全攻略 引言 在现代应用中&#xff0c;数据库是核心组件之一。无论是个人项目还是企业级应用&#xff0c;数据的安全性和完整性都至关重要。为了防止数据丢失、损坏或意外删除&#xff0c;定期备份数据库是必不可少的。本文将详细介绍 MySQL 数据库的备…

Cesium基础-(Entity)-(Billboard)

里边包含Vue、React框架代码 2、Billboard 广告牌 Cesium中的Billboard是一种用于在3D场景中添加图像标签的简单方式。Billboard提供了一种方法来显示定向的2D图像,这些图像通常用于表示简单的标记、符号或图标。以下是对Billboard的详细解读: 1. Billboard的定义和特性 B…

DEVOPS: 容器与虚拟化与云原生

概述 传统虚拟机&#xff0c;利用 hypervisor&#xff0c;模拟出独立的硬件和系统&#xff0c;在此之上创建应用虚拟机是一个主机模拟出多个主机虚拟机需要先拥有独立的系统docker 是把应用及配套环境独立打包成一个单位docker 是在主机系统中建立多个应用及配套环境docker 是…