京东6.18大促主会场领京享红包更优惠

 找回密码
 立即注册

QQ登录

只需一步,快速开始

Html5页面播放M4a音频文件

2024-11-2 22:26| 发布者: 284cc| 查看: 73| 评论: 0

摘要: 业务场景: 手机app端灌音,然后上传至背景服务器,前端从背景服务器获取灌音,在PC端WEB页面播放。 现实标题: 首先app灌音文件默认是m4a格式,而在PC端WEB H5页面,<audio>标签并没有明白写着支持m4a格式,如果app

业务场景:

手机app端灌音,然后上传至背景服务器,前端从背景服务器获取灌音,在PC端WEB页面播放。

现实标题:

首先app灌音文件默认是m4a格式,而在PC端WEB H5页面,<audio>标签并没有明白写着支持m4a格式,如果app端生成的灌音不做相关设置,而用默认设置,在H5上确实是播放不了的。

其实一开始,我没有想太多,也是想着把m4a文件转成mp3给前台用。

在网上查了一番,许多都说用jave-1.0.2.2.jar,然而其实这个包很旧,而且在windows上是可以转,但centos8上不支m4a格式转码,在体系上有兼容性标题。信我,别用它

然后又在码库里找了比较靠谱的是这个包,这里附个链接: https://github.com/a-schild/jave2,这个包也是基于ffmpeg的,提供了支持win64、osx64、linux64的依赖,建义在maven打包时,根据开发或生产情况的差别,打包时引用相应情况的依赖。

下面附上我的m4a转mp3的java代码:

pom.xml

[code] <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com</groupId> <artifactId>test</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>pom</packaging> <properties> <jave.version>2.7.1</jave.version> </properties> <dependencyManagement> <dependencies> <!--灌音转换,jave-all-deps 包涵了全部平台的依赖,由于打包太大,建议打包时选指定的依赖--> <!--<dependency>--> <!--<groupId>ws.schild</groupId>--> <!--<artifactId>jave-all-deps</artifactId>--> <!--<version>${jave.version}</version>--> <!--</dependency>--> <!--灌音转换,指定平台依赖,jave-core必须指定--> <dependency> <groupId>it.sauronsoftware</groupId> <artifactId>jave</artifactId> <groupId>ws.schild</groupId> <artifactId>jave-core</artifactId> <version>${jave.version}</version> </dependency> </dependencies> </dependencyManagement> <!--激活profile配置,用来切换不怜悯况的配置--> <profiles> <profile> <id>dev</id> <properties> <profiles.actives>dev</profiles.actives> </properties> <activation> <activeByDefault>true</activeByDefault> <activeByDefault>false</activeByDefault> </activation> <dependencies> <dependency> <groupId>ws.schild</groupId> <artifactId>jave-nativebin-linux64</artifactId> <version>${jave.version}</version> </dependency> </dependencies> </profile> <profile> <id>pro</id> <properties> <profiles.actives>pro</profiles.actives> </properties> <activation> <activeByDefault>false</activeByDefault> </activation> <dependencies> <dependency> <groupId>ws.schild</groupId> <artifactId>jave-nativebin-linux64</artifactId> <version>${jave.version}</version> </dependency> </dependencies> </profile> <profile> <id>test</id> <properties> <profiles.actives>test</profiles.actives> </properties> <activation> <activeByDefault>true</activeByDefault> </activation> <dependencies> <dependency> <groupId>ws.schild</groupId> <artifactId>jave-nativebin-win64</artifactId> <version>${jave.version}</version> </dependency> </dependencies> </profile> </profiles> </project>[/code]

灌音文件转换代码:

[code] package com.utils; import com.alibaba.fastjson.JSON; import com.qirui.framework.common.base.syslog.SysLog; import com.qirui.framework.common.base.syslog.SysLogAnnotation; import com.qirui.framework.common.base.syslog.SysLogPrint; import com.qirui.framework.common.utils.RequestUtil; import org.springframework.stereotype.Component; import ws.schild.jave.*; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; /** * @ClassName AudioTransUtil * @Description 灌音转换 * @Author admin * @Version 1.0.0 **/ @Component public class AudioTransUtil { static { // 项目是springboot jar包, jar包内的代码要读取外面文件夹的文件,需要处置惩罚一下读取路径, // 这里是把灌音源文件和转换文件放在springboot jar包的同级文件夹下 String path = AudioTransUtil.class.getProtectionDomain().getCodeSource().getLocation().getPath(); if(path.contains("jar")){ //file:/F:/ideaWorkspace/test/smp-admin/framework-client/target/framework-client-0.0.1-SNAPSHOT.jar!/BOOT-INF/lib/framework-service-0.0.1-SNAPSHOT.jar!/ //去掉 "file:" path = path.substring(path.indexOf("/"), path.length()); } if(System.getProperty("os.name").contains("dows")) { path = path.substring(1, path.length()); //widonws的jar包 if(path.contains("jar")){ path = path.substring(0, path.indexOf(".jar")); rootPath = path.substring(0, path.lastIndexOf("/")); }else{ rootPath = path.replace("/target/classes/", ""); } }else if(System.getProperty("os.name").contains("Mac")){ rootPath = path.replace("/target/classes/", ""); } else { path = path.substring(0, path.indexOf(".jar")); rootPath = path.substring(0, path.lastIndexOf("/")); } } protected static final String rootPath; /** *目录路径 */ private static final StringBuilder dirPathStr = new StringBuilder(rootPath).append("/temp/audio/"); private static final String MP3 = "mp3"; @SysLogAnnotation(descript = "灌音转换格式") public String trans2Mp3(byte[] sourceAudioBytes, String sourceAudioName){ //文件路径 String soureAudioFilePathStr = new StringBuilder(dirPathStr).append(sourceAudioName).toString(); String sourceAudioType = sourceAudioName.substring(sourceAudioName.indexOf(".")+1); String targetAudioFilePathStr = new StringBuilder(soureAudioFilePathStr).toString().replace(sourceAudioType, MP3); BufferedOutputStream bos = null; FileOutputStream fos = null; try{ File dir = new File(dirPathStr.toString()); if(!dir.exists()){ dir.mkdirs(); } File sourceAudioFile = new File(soureAudioFilePathStr); fos = new FileOutputStream(sourceAudioFile); bos = new BufferedOutputStream(fos); bos.write(sourceAudioBytes); File targetAudioFile = new File(targetAudioFilePathStr); AudioAttributes audioAttributes = new AudioAttributes(); audioAttributes.setCodec("libmp3lame"); audioAttributes.setBitRate(new Integer(32000)); // audioAttributes.setChannels(new Integer(2)); // audioAttributes.setSamplingRate(new Integer(22050)); EncodingAttributes attrs = new EncodingAttributes(); attrs.setFormat("mp3"); attrs.setAudioAttributes(audioAttributes); Encoder encoder = new Encoder(); //在有需要时添加,可根据差别体系情况,检察支持处置惩罚的文件格式 System.out.println("encoder.getVideoDecoders():" + JSON.toJSON(encoder.getVideoDecoders()).toString()); System.out.println("encoder.getSupportedDecodingFormats():" + JSON.toJSON(encoder.getSupportedDecodingFormats()).toString()); MyJaveListener myJaveListener = new MyJaveListener(); encoder.encode(new MultimediaObject(sourceAudioFile), targetAudioFile, attrs, myJaveListener); }catch (Exception e){ e.printStackTrace(); }finally { try { if(null != bos){ bos.close(); } if(null != fos){ fos.close(); } } catch (IOException e) { e.printStackTrace(); } } SysLog sysLog = new SysLog(); sysLog.setLogId(RequestUtil.getAccessLogId()); sysLog.setParams(targetAudioFilePathStr); sysLog.setDescript("灌音转换路径"); SysLogPrint.printSysLogBody(sysLog); return targetAudioFilePathStr; } // 删除当地临时灌音 public void deleteTempAudio(String fileName){ //文件路径 String fileNameTemp = fileName.substring(fileName.lastIndexOf("/")+1, fileName.length()); String soureAudioFilePathStr = new StringBuilder(dirPathStr).append(fileNameTemp).toString(); String sourceAudioType = fileName.substring(fileName.indexOf(".")+1); String targetAudioFilePathStr = new StringBuilder(soureAudioFilePathStr).toString().replace(sourceAudioType, MP3); File file = new File(soureAudioFilePathStr); file.delete(); file = new File(targetAudioFilePathStr); file.delete(); } /** * 灌音转码处置惩罚监听器,可监听文件处置惩罚结果,对于错误信息很有用 */ private class MyJaveListener implements EncoderProgressListener { @Override public void sourceInfo(MultimediaInfo multimediaInfo) { System.out.println("MyListener.sourceInfo:" + JSON.toJSON(multimediaInfo).toString()); } @Override public void progress(int i) { System.out.println("MyListener.progress:" + i); } @Override public void message(String s) { System.out.println("MyListener.message:" + s); } } }[/code]

上面的代码,在centos8情况是可以正常转换的,开一始,我的生产情况也用了这份。

厥后,我去找了m4a和mp3、mp4的区别,发现 mp4是使用了MPEG-4举行封装的AAC编码,而M4A的本质和音频MP4雷同,它是区别纯音频MP4文件和包含视频的MP4文件而由苹果(Apple)公司使用的扩展名。

那么疑问来了,竟然m4a和mp4的本质雷同,那么竟然欣赏器H5可以播放mp4,为什么m4a不可,原因在音频的编码上,AAC编码是解决标题的关键。

下面附上安卓内部输出灌音代码中的几个关键截图:

默认如果不设置,AudioEncoder是0,0并不是AAC编码,我们需要在输出格式上设置MPEG_4,并把编码格式设置成AAC,

如第三图中所示:

[code] setOutPutFormat(MediaRecorder.OutputFormat.MPEG_4) setAudioEncoder(MediaRecorder.AudioEncoder.AAC) [/code]

如许,生成的m4a灌音文件,就可以直接在欣赏器H5页面中播放了,完全不需要背景,在整个程序个不但少了代码的转码时间,本身m4a文件也很小。

到此这篇关于Html5页面播放M4a音频文件的文章就先容到这了,更多相关Html5播放M4a 内容请搜刮脚本之家以前的文章或继续欣赏下面的相关文章,希望大家以后多多支持脚本之家!


来源:https://www.jb51.net/html5/768832.html
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
关闭

站长推荐上一条 /6 下一条

QQ|手机版|小黑屋|梦想之都-俊月星空 ( 粤ICP备18056059号 )|网站地图

GMT+8, 2025-7-2 09:18 , Processed in 0.029880 second(s), 18 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2025 Discuz! Team.

返回顶部