Java 實現音訊新增自定義時長靜音(附程式碼) | Java工具類
前言 wav音訊新增自定義時長靜音的工具類 Maven依賴 <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>30.1.1-jre</version> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.5.2</version> </dependency> 程式碼 package ai.guiji.csdn.tools; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.URLUtil; import com.google.common.base.Joiner; import com.google.common.primitives.Bytes; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.LongStream; /** java專案 fhadmin.cn **/ public class WavAddSilenceUtils { /** * 根據PCM檔案構建wav的header欄位 * * @param srate Sample rate - 8000, 16000, etc. * @param channel Number of channels - Mono = 1, Stereo = 2, etc.. * @param format Number of bits per sample (16 here) * @throws IOException */ public static byte[] buildWavHeader(int dataLength, int srate, int channel, int format) throws IOException { byte[] header = new byte[44]; long totalDataLen = dataLength + 36; long bitrate = srate * channel * format; header[0] = 'R'; header[1] = 'I'; header[2] = 'F'; header[3] = 'F'; header[4] = (byte) (totalDataLen & 0xff); header[5] = (byte) ((totalDataLen >> 8) & 0xff); header[6] = (byte) ((totalDataLen >> 16) & 0xff); header[7] = (byte) ((totalDataLen >> 24) & 0xff); header[8] = 'W'; header[9] = 'A'; header[10] = 'V'; header[11] = 'E'; header[12] = 'f'; header[13] = 'm'; header[14] = 't'; header[15] = ' '; header[16] = (byte) format; header[17] = 0; header[18] = 0; header[19] = 0; header[20] = 1; header[21] = 0; header[22] = (byte) channel; header[23] = 0; header[24] = (byte) (srate & 0xff); header[25] = (byte) ((srate >> 8) & 0xff); header[26] = (byte) ((srate >> 16) & 0xff); header[27] = (byte) ((srate >> 24) & 0xff); header[28] = (byte) ((bitrate / 8) & 0xff); header[29] = (byte) (((bitrate / 8) >> 8) & 0xff); header[30] = (byte) (((bitrate / 8) >> 16) & 0xff); header[31] = (byte) (((bitrate / 8) >> 24) & 0xff); header[32] = (byte) ((channel * format) / 8); header[33] = 0; header[34] = 16; header[35] = 0; header[36] = 'd'; header[37] = 'a'; header[38] = 't'; header[39] = 'a'; header[40] = (byte) (dataLength & 0xff); header[41] = (byte) ((dataLength >> 8) & 0xff); header[42] = (byte) ((dataLength >> 16) & 0xff); header[43] = (byte) ((dataLength >> 24) & 0xff); return header; } /** * 預設寫入的pcm資料是16000取樣率,16bit,可以按照需要修改 * * @param filePath * @param pcmData */ public static boolean writeToFile(String filePath, byte[] pcmData) { BufferedOutputStream bos = null; try { bos = new BufferedOutputStream(new FileOutputStream(filePath)); byte[] header = buildWavHeader(pcmData.length, 16000, 1, 16); bos.write(header, 0, 44); bos.write(pcmData); bos.close(); return true; } catch (Exception e) { e.printStackTrace(); } finally { if (bos != null) { try { bos.close(); } catch (IOException e) { e.printStackTrace(); } } } return false; } /** * 增加延時靜音 * * @param filePath 音訊地址 * @param tmpDirPath 臨時目錄地址 * @param delayTime 延時時長,單位毫秒 * @return 最終檔案地址 * @throws Exception 異常 */ public static String delayWav(String filePath, String tmpDirPath, Long delayTime) throws Exception { byte[] bytes; if (filePath.startsWith("http")) { bytes = IoUtil.readBytes(URLUtil.getStream(new URL(filePath))); } else { bytes = FileUtil.readBytes(filePath); } List<Byte> resultByte = new ArrayList<>(Bytes.asList(Arrays.copyOfRange(bytes, 44, bytes.length))); LongStream.range(0, (long) (delayTime * 32)).forEach(x -> resultByte.add((byte) 0)); String resultPath = Joiner.on(File.separator).join(Arrays.asList(tmpDirPath, IdUtil.simpleUUID() + ".wav")); writeToFile(resultPath, Bytes.toArray(resultByte)); return resultPath; } public static void main(String[] args) throws Exception { System.out.println(delayWav("\\Users\\huyi\\Desktop\\", 10000L)); } } 程式碼說明: 1、delayWav方法引數分別為wav音訊檔案地址(可以支援http的url地址)、臨時檔案目錄地址、延時靜音時長(單位毫秒) 2、對wav的要求預設為:取樣率16K、單聲道。 對需要處理的音訊引數調整。 3、生成uuid的隨機檔名,避免重複。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31558068/viewspace-2854291/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 音樂格式轉換:java程式碼實現Java
- Vue + WebRTC 實現音視訊直播(附自定義播放器樣式)VueWeb播放器
- 【JAVA】自定義類載入器實現類隔離Java
- Java 實現壓縮圖片,影片,音訊案例Java音訊
- 為Java程式中新增播放MIDI音樂功能Java
- QLab Pro for Mac(現場表演類實時音影片編輯工具)Mac
- 網易易盾音訊過濾服務再次迭代 新增音訊實時檢測音訊
- [程式設計]Java實現解析抖音無水印影片程式設計Java
- ffmpeg 去除音訊中的靜音音訊
- pytorch載入語音類自定義資料集PyTorch
- 自定義實現Complex類
- 原生JAVA即時通訊系統原始碼語音視訊聊天軟體Java原始碼
- 音視訊同步!RTCP 協議解析及程式碼實現TCP協議
- java時間工具類Java
- iOS音訊程式設計之實時語音通訊(對講機功能)iOS音訊程式設計
- WebRTC 音訊演算法 附完整C程式碼Web音訊演算法C程式
- 【自定義View】抖音網紅文字時鐘-上篇View
- 相親交友原始碼中,音訊AAC解碼的實現程式碼原始碼音訊
- Java靜態程式碼塊Java
- python實現播放音訊和錄音功能示例程式碼Python音訊
- Linux 安裝ffmpeg 實現音訊轉碼Linux音訊
- JMeter擴充套件Java請求實現WebRTC本地音視訊推流壓測指令碼JMeter套件JavaWeb指令碼
- Mac 使用音訊工具分析音訊資料Mac音訊
- Java實現TCP通訊程式JavaTCP
- JAVA Comparator 自定義排序 原始碼分析Java排序原始碼
- Java 新增 、讀取以及刪除PPT幻燈片中的視訊、音訊檔案Java音訊
- 科大訊飛語音轉文字以及中文分詞的Java測試程式碼中文分詞Java
- Android 音視訊錄製硬編碼實現Android
- java使用sshd 實現sftp 自定義顯示目錄JavaFTP
- 小程式自定義音訊元件,帶滾動條,IOS迴圈失效問題音訊元件iOS
- 從java內建類和自定義類比較Comparable介面和Comparator介面實現排序的不同Java排序
- java工具類之編碼轉換工具類Java
- Swift自定義表情鍵盤+錄音Swift
- java如何讓程式碼變得優雅——自定義註解Java
- StompJS+SpeechSynthesis實現前端訊息實時語音播報JS前端
- app直播原始碼,java自定義註解APP原始碼Java
- 萬彩動畫大師教程 | 新增音訊、音樂動畫音訊
- 技術分享| 小程式實現音視訊通話