当前位置: 首页 > news >正文

音频解码及如何在Java实现

本人并不干这个,但是被迫下水了解了一下这个,稍微做了一下整理。再就是感觉现在网上以及ChatGPT在这方面给出的答案太水了,在此开辟一篇。无意放出代码,这里只介绍一些可能重要的点。

本来以为有了ChatGPT写这些就没有必要了,现在看起来还是不太可能。

  • 一是知识稍微旧了一点,新一点的没有,比如github上近一年更新的优秀项目100%是不会出现在解决方案中的。追求能用是不影响的,但是想找最好的有点难。
  • 二是方案缺少出处,扩展溯源困难。
  • 三是多方案比较困难,不易从中选取出最好的方案。
  • 四是幻觉太多,验证成本太高。

1. 解码

这里将解码定义为将有损/无损的(压缩)格式,比如 mp3/aac 等等转换到 pcm/wav 这种原始数据的格式的操作,供下游使用。
原始数据可以理解为 采样率 × 位深度 × 通道数 × 音频时长 的数据,不加其它处理。

2. 基本参数

来自 javax.sound.sampled.AudioFormat,先要理解记住这些才能够有良好掌控
- encoding – the audio encoding technique
- sampleRate – the number of samples per second
- sampleSizeInBits – the number of bits in each sample
- channels – the number of channels (1 for mono, 2 for stereo, and so on)
- frameSize – the number of bytes in each frame
- frameRate – the number of frames per second
- bigEndian – indicates whether the data for a single sample is stored in big-endian byte order

3. FFmpeg

A complete, cross-platform solution to record, convert and stream audio and video.

可能是最强的功能非常齐全,离线格式转换命令行就用它了,但是要注意ffmpeg在做转换时有不少参数直接默认了,使用代码转换可能有各种对不上(所以需要对参数的理解)。

常见音频编码都是确定性编码,不要自欺欺人觉得大小不一致还是正常的,得每一个byte都一样才正常。

4. javax.sound.sampled

  • 支持PCM/WAV之类的原始音频格式
  • service provider: 在实现之后能够自动发现和支持更多格式

5. hendriks73/ffsampledsp

有了1-4的铺垫之后就只需要一个优秀项目来完成剩余的工作了,目前看起来FFSampledSP是最佳选择(之一,服务器的)

FFSampledSP is an implementation of the javax.sound.sampled service provider interfaces based on FFmpeg, a complete, cross-platform solution to record, convert and stream audio and video. FFSampledSP is part of the SampledSP collection of javax.sound.sampled libraries.

  • 相当于引入了ffmepg的能力,在已有的库中实现得是相当好的了。
  • 解码流的时候需要调试参数,可以先校验是否能转换
    AudioInputStream fileStream = AudioSystem.getAudioInputStream(file);
    AudioFormat sourceFormat = fileStream.getFormat();
    log.info("in audio format: {}", aacFormat);
    AudioFormat targetFormat = new AudioFormat();
    AudioSystem.isConversionSupported(sourceFormat, targetFormat); // 需要为true
    
  • 引入依赖即可,并无太多需要注意的。也就是知识要得挺多,使用起来反而没什么。
http://www.lryc.cn/news/133070.html

相关文章:

  • Webshell 及检测绕过
  • Ubuntu22.4系统mongodb数据库安装
  • Vue初识别--环境搭建--前置配置过程
  • 数据在内存中的储存·大小端(文字+画图详解)(c语言·超详细入门必看)
  • Word怎么转换成PDF文档?多个Word转换成PDF步骤分享
  • 【C++习题集】-- 堆
  • vue + vue-office 实现多种文件(docx、excel、pdf)的预览
  • 30.Netty源码服务端启动主要流程
  • ssh端口转发
  • 独立站SEO是什么意思?自主网站SEO的含义?
  • Android JNI系列详解之NDK和JNI介绍
  • LeetCode //C - 20. Valid Parentheses
  • 浅析Java设计模式之四策略模式
  • 基于Spring Boot的餐厅订餐网站的设计与实现(Java+spring boot+MySQL)
  • 【图像分割】理论篇(1)评估指标代码实现
  • Git checkout 某个版本到指定文件夹下
  • Java多态详解(2)
  • Camtasia导入srt字幕乱码
  • YOLOv5、YOLOv8改进:SOCA注意力机制
  • 机器人的运动范围
  • 学习笔记|基于Delay实现的LED闪烁|模块化编程|SOS求救灯光|STC32G单片机视频开发教程(冲哥)|第六集(下):实现LED闪烁
  • 微服务-Ribbon(负载均衡)
  • 解决C#报“MSB3088 未能读取状态文件*.csprojAssemblyReference.cache“问题
  • GeoScene Pro在地图制图当中的应用
  • 国标混凝土结构设计规范的混凝土本构关系——基于python代码生成
  • 系统架构设计-架构师之路(八)
  • 【SA8295P 源码分析】25 - QNX Ethernet MAC 驱动 之 emac_isr_thread_handler 中断处理函数源码分析
  • 函数栈帧的创建与销毁
  • 工业安全生产平台在面粉行业的应用分享
  • Gitlab服务部署及应用