Java Mp3转化WAV/PCM音频数据,解码详细解析,提取每一帧数据集合/比特流/播放,一行代码!

这篇具有很好参考价值的文章主要介绍了Java Mp3转化WAV/PCM音频数据,解码详细解析,提取每一帧数据集合/比特流/播放,一行代码!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

导言

大家好!我是原子君
1.因为Java本身只支持,wav,缺少mp3的解码器,所以Java自带的无法对mp3进行处理,这种 MPEG-*音频有损压缩标准编码 ,更不要说使用Java的音频格式和音频流就可以解决。
2.所以本次转换需要使用到colorful1.1这种纯Java-Pc可跨平台的工具框架。
注意:colorful只支持Java19,因为早在之前这就是为了解决Java上遇到的各种麻烦而开发的,所以可以在开发中启到不少帮助。
3. Mp3说白了就是一种压缩技术, 其优点是压缩后占用空间小适用于移动设备的存储和使用。而且还非常好的保持了原来的音质
4.那我们可以开始了:新手安装教程-> 点击我查看,完成开源,免费,可商用。

解码过程

PCM进行MP3压缩:
封装:以1152个PCM采样值为单位,封装成具有固定长度的MP3数据帧,同时帧是MP3文件的最小组成单位。
利用数据帧:在解码时,利用数据帧中的信息就可以恢复1152个PCM的采样值。
粒度组:而这1152个采样值会被分为2个粒度组,每个粒度组包含576个采样值。
数据帧:一个MP3数据帧分为5个部分,帧头、CRC校验值、边信息、主数据、附加数据。

Mp3结构

MP3 文件一般分为三部分:ID3V2,Frame,ID3V1也属于帧,叫标签帧,Frame 部分叫数据帧,在MP3 文件内不一定有标签帧,但一定有数据帧.

ID3V2
在mp3中的首部-它包含了作者,作曲,专辑,等一些信息,注意长度是不固定的
扩展了ID3V1的信息量.
音频数据Frame
1.由一系列的数据帧构成,帧的数量由文件大小和帧长决定.
2.每个Frame 的长度可能不相等,也可能相等,由位率决定.
3.每个Frame 分为帧头和数据实体两部分.
4.帧头:记录着mp3 的位率,采样率,版本等信息,
5.每个帧之间相互独立.如果启用CRC 校验,则帧头后跟随2字节CRC 校验,后面可能会有32字节的附加信息。
ID3V1:包含了作者,作曲,专辑等信息,长度 固定为128,标准并不周全,存放的信息少,无法存放歌词,无法录入专辑封面、图片等.
ID3 V2.0 是一个相当完备的标准,但给编写软件带来困难,虽然赞成此格式的人很多,在软件中真正实现的却极少,现在绝大多数MP3 仍使用 ID3 V1.0 标准。此标准是将MP3 文件尾的最后128 个字节用来存放ID3 信息.
说明信息
一些mp3可能会携带一些额外的说明信息。

ID3V2解析

开始处,长度为10字节,结构如下:

java音频解码,Colorful框架,框架,Java,pcm,音视频,java,后端,开发语言,Powered by 金山文档

标签头

头部标识:占3个字节,由字符ID3组成,表示这是一个ID3v2的标签;
主版本号:版本号 ID3V2.3 就记录 3
副版本号:这里记录为0
标签大小:代表的是后面所有标签帧的总大小。一共占四个字节, 但是按照ID3v2 标准的要求,每个字节只用 7 位,最高位不使用,恒为 0,比如:如果后面标签帧的总大小是257,那么在写入时,就必须是:513
数值在写入时:必须以大端格式写入,由于计算结果需要将每个字节的最高位0位丢弃
    public static int discard(int num)
    {
        int result = 0, mask = 0x7F;
        while ((mask ^ 0x7FFFFFFF)==1)
        {
            result = num & ~mask;
            result <<= 1;
            result |= num & mask;
            mask = ((mask + 1) << 8) - 1;
            num = result;
        }
        return result;
    }

恢复:

    public static int recovery(int num) {
        byte[] D = new byte[4];
        D[0] = (byte) (num & 0xff);
        D[1] = (byte) (num >> 8 & 0xff);
        D[2] = (byte) (num >> 16 & 0xff);
        D[3] = (byte) (num >> 24 & 0xff);
        int Result = 0x0;
        Result = Result | D[0];
        Result = Result | (D[1] << 7);
        Result = Result | (D[2] << 14);
        Result = Result | (D[3] << 21);
        return Result;
    }
如果不懂大小端可以看我这一篇文章: 点击我查看

标签帧

数据结构定义:
TIT2 = 标题 表示内容为这首歌的标题
TPE1 = 作者
TALB = 专集
TRCK = 音轨 格式:N/M 其中 N 为专集中的第 N 首,M 为专集中共 M 首,N 和 M 为 ASCII 码表示的数字
TYER = 年代 是用 ASCII 码表示的数字
TCON = 类型 直接用字符串表示
COMM = 备注 格式:"eng/0 备注内容",其中 eng 表示备注所使用的自然语言
Size = 代表帧标记暂时不清楚有什么实际含义。
flags = 代表帧内容的大小,这里要注意,写入时也必须为大端格式。

Frame解析-标签帧

帧头:4字节, 帧头后面可能有两个字节的CRC 校验,这两个字节的是否存在决定于帧头信息的第16bit, 为0 则帧头后面无校验,为1 则有校验,校验值长度为2 个字节.
(后面是可变长度的附加信息,对于标准的MP3文件来说,其长度是32字节,本括号内的文字内容有待商榷,暂时没见到这样的文件),紧接其后的 是压缩的声音数据,当解码器读到此处时就进行解码了。

所有的Mp3文件的数据帧开始的两个字节都必需是“FF FA”或者 “FF FB”

名称

位长

说 明

同步信息

11

第2字节

所有位均为1,第1字节恒为FF。

版本

2

00-MPEG 2.5 ,01-未定义,10-MPEG 2 ,11-MPEG 1

2

00-未定义 ,01-Layer 3,10-Layer 2 ,11-Layer 1

CRC校验

1

0-校验 ,1-不校验

位率

4

第3字节

取样率,单位是kbps,如:采用MPEG-1 Layer 3,64kbps是,值为0101。

bits V1,L1---V1,L2---V1,L3---V2,L1---V2,L2---V2,L3

0000--free--free--free--free--free--free

0001--32--32--32--32(32)--32(8)--8 (8)

0010--64--48--40--64(48)--48(16)--16 (16)

0011--96--56--48--96(56)--56(24)--24 (24)

0100--128--64--56--128(64)--64(32)--32 (32)

0101--160--80--64--160(80)--80(40)--64 (40)

0110--192--96--80--192(96)--96(48)--80 (48)

0111--224--112--96--224(112)--112(56)--56 (56)

1000--256--128--112--256(128)--128(64)--64 (64)

1001--288--160--128--288(144)--160(80)--128 (80)

1010--320--192--160--320(160)--192(96)--160 (96)

1011--352--224--192--352(176)--224(112)--112 (112)

1100--384--256--224--384(192)--256(128)--128 (128)

1101--416--320--256--416(224)--320(144)--256 (144)

1110--448--384--320--448(256)--384(160)--320 (160)

1111--bad--bad--bad--bad--bad--bad

V1 - MPEG 1,V2 - MPEG 2 and MPEG 2.5

L1 - Layer 1 ,L2 - Layer 2 , L3 - Layer 3

"free" :位率可变 "bad" :不允许值

采样频率

2

MPEG-1: 00-44.1kHz ,01-48kHz ,10-32kHz ,11-未定义

MPEG-2: 00-22.05kHz , 01-24kHz ,10-16kHz ,11

MPEG-2.5: 00-11.025kHz ,01-12kHz ,10-8kHz ,11-未定义

帧长调节

1

用来调整文件头长度,0-无需调整,1-调整

保留字

1

没有使用

声道模式

2

第 4字节

00-立体声 ,01-联合立体声(是基于帧与帧完成的), 10-双声道 ,11-单声道

扩充模式

2

声道是01时用:Value强度立体声,MS立体声

00 off off

01 on off

10 off on

11 on on

版权

1

0-不合法 1-合法

原版标志

1

0-非原版 1-原版

强调方式

2

用于声音经降噪压缩后再补偿的分类,很少用到,今后也可能不会用。

00-未定义 01-50/15ms 10-保留 11-CCITT J.17

帧长计算

计算公式:取决于 位率频率
Lyaer 1使用公式:
帧长度(字节) = 每帧采样数 / 采样频率 * 比特率/ 8 +填充 * 4
Lyer 2和Lyaer 3使用公式:
帧长度(字节)= 每帧采样数 / 采样频率 * 比特率/ 8 + 填充

2.帧的填充大小就是第23位的帧长调节,不是0就是1。
3.采样个数:MPEG1-3的不同规范,以及同一规范中不同的 Layer1-3,每一帧
对应的采样,都是固定的,具体的值看下表(单位:个/帧):

MPEG帧的采样表

MPEG 1

MPEG 2(LSF)

MPEG 2.5(LSF)

Layer 1

384

384

384

Layer 2

1152

1152

1152

Layer 3

1152

576

576

每帧播放时长

每帧播放持续时间 = 帧大小 / 采样率

ID3V1尾部说明

字节

长度-bytes

内容

1-3(A)

3

存储了“TAG”字符,表示ID3V1标准,后面歌曲信息。

4-33(B)

30

歌名称

34-63(C)

30

作者名称

64-93(D)

30

专辑名称

94-97(E)

4

年份

98-125(F)

28

附注

126(G)

1

保留位

127(H)

1

音轨号

127(I)

1

MP3音乐类别一共147种

各项信息按顺序存放,没有任何标识将其分开,比如标题信息不足30 个字节,会使用”\0”填充。

Mp3解码还原流程

MP3解码经MP3编码方式压缩后的音频数据还原成原始PCM数据的过程。

MP3解码的整个工作流程见图下图,当预处理操作把MP3帧中的帧头和边信息解码后,解码器对经预处理后的信息进行缩放因子解码和哈夫曼解码,得出的结果再经反量化、重排序、立体声解码、混叠消除、逆离散余弦变换、频率反转和子带合成滤波等操作后,得到左右声道PCM音频数据,完成整个解码过程。
java音频解码,Colorful框架,框架,Java,pcm,音视频,java,后端,开发语言,Powered by 金山文档

解码导言

这些个复杂的解码过程,我已经为大家封装好了,大家直接调用就可以导出左右PCM数据,
和对Mp3的播放。

上代码

前言
我提供了多种方法,共大家使用。

最适合新手的,最快捷的

如果你需要直接播放,我们为你封装好了,此方式,__response是一个工具框架响应快捷类。
java音频解码,Colorful框架,框架,Java,pcm,音视频,java,后端,开发语言,Powered by 金山文档
代码见下即可:
import IOS_SHOGUN_Component.__response;
import IOS_SHOGUN_Component.decodeAean.Mp3DecodeException;

import javax.sound.sampled.SourceDataLine;
import java.io.*;
public class Java {

    public static void main(String[] X) throws IOException {
        try {
            try (SourceDataLine Mp3 = __response.Debug_PlayMp3("Mp3地址")) {
                
            }
        } catch (Mp3DecodeException e) {
            throw new RuntimeException(e);
        }
    }
}

直接导出数据

如果你要直接导出PCM用于缓存或者其他,持久性性存储

两种存储方式

一种是Base64这种二进制存储方式占用内存小,转换后的大小比例大概为1/3,降低了资源服务器的消耗;
base64编码的字符串,更适合不同平台、不同语言的传输
一种是流存储的方式,不过这种大概只能用于暂时性的缓存,不推荐全部转化为了字节数组,因为
存在丢失的风险,通俗来讲就是,你的音频就变成一段乱音了。

TaskList<String>方式

内容:
保存了每一帧的解码后的二进制数据,随时可以对数据持久化。
也可以对数据音频进行剪辑,等其他变声操作。
它也可以导出成其他list集合,以及提供了非常的API方式,
原始API与Java自带的是一致的线程安全集合。
注意:
在将每一帧的提出并且缓存时,我们需要将它转化为,音频数据
import IOS_SHOGUN_Component.TaskList;
import IOS_SHOGUN_Component.__response;
import IOS_SHOGUN_Component.decodeAean.Mp3DecodeException;
import java.io.*;
public class Java {

    public static void main(String[] X) throws IOException {
        try {
            TaskList<String> Data=__response._mp3_extract_mode_Base64("路径");
            //保存了每一帧的PCM解码数据
            byte[] PCM=__response._base64_T_X2(Data.get(0));
        } catch (Mp3DecodeException e) {
            throw new RuntimeException(e);
        }
    }
}

流方式

两种方式,一种是ByteArrayOutputStream,一种是ByteArrayInputStream两种方式
import IOS_SHOGUN_Component.__response;
import IOS_SHOGUN_Component.decodeAean.Mp3DecodeException;
import java.io.*;
public class Java {

    public static void main(String[] X) throws IOException {
        try {
            ByteArrayInputStream I=__response._mp3_extract_mode_IStream("路径");
            ByteArrayOutputStream O=__response._mp3_extract_mode_OStream("路径");
        } catch (Mp3DecodeException e) {
            throw new RuntimeException(e);
        }
    }
}

快捷方式还有很多

java音频解码,Colorful框架,框架,Java,pcm,音视频,java,后端,开发语言,Powered by 金山文档

你也可以直接导出成pcm格式文件

同样可以使用快捷方式
你可以使用常用的本地导出,和缓存的TaskList<String>,流方式
java音频解码,Colorful框架,框架,Java,pcm,音视频,java,后端,开发语言,Powered by 金山文档

Mp3是缓存数据不是-本地数据怎么提取转换成Pcm数据?

在Colorful1.1中提供了流读取的支持,比如如果是客户端发送来的音频数据,我们就可以使用它。

翻译成ByteArrayInputStream

java音频解码,Colorful框架,框架,Java,pcm,音视频,java,后端,开发语言,Powered by 金山文档

翻译成ByteArrayOutputStream

java音频解码,Colorful框架,框架,Java,pcm,音视频,java,后端,开发语言,Powered by 金山文档

非快捷方式

它同时准备了非快捷的接口,看下图这些快捷方式只是对原本开放的API做了一次完成的封装。
_mp3_extract_mode_Decode
java音频解码,Colorful框架,框架,Java,pcm,音视频,java,后端,开发语言,Powered by 金山文档
Debug_PlayMp3
java音频解码,Colorful框架,框架,Java,pcm,音视频,java,后端,开发语言,Powered by 金山文档
同样我们可以直接复制
参数Audio,音频输出类,存储方式,是否是本地引入/缓存引入(CacheData),缓存引入时,它只能执行转化程序。
import IOS_SHOGUN_Component.decodeAean.AudioBuffer;
import IOS_SHOGUN_Component.decodeAean.DecodeSuperclasses;
import IOS_SHOGUN_Component.decodeAean.Header;
import IOS_SHOGUN_Component.decodeAean.Mp3DecodeException;
import IOS_SHOGUN_Component.mp3_Decode;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
import java.io.*;
public class Java {

    public static void main(String[] X) throws IOException, Mp3DecodeException {

        mp3_Decode Create = new mp3_Decode(new mp3_Decode.Audio(), AudioBuffer.STREAM, mp3_Decode.LocalData);
        Create.open("路径/流的方式", false);
        
        if (Create.onCreateAndStart()) {

            DecodeSuperclasses DECODE = Create.getPCM_DecodeSuperclasses();
            Header Head = DECODE.getRecording();
            AudioFormat af = new AudioFormat((float) Head.getSamplingRate(), 16, Head.getChannels(), true, false);

            SourceDataLine DataLineSource;
            try {
                DataLineSource = AudioSystem.getSourceDataLine(af);
            } catch (LineUnavailableException var8) {
                throw new RuntimeException(var8);
            }

            try {
                DataLineSource.open(af, 8 * Head.getPcmSize());
            } catch (LineUnavailableException var7) {
                throw new RuntimeException(var7);
            }

            DataLineSource.start();
            ByteArrayInputStream D = DECODE.getAudioBuffer().getPcmDataExportIStream();
            byte[] DD = new byte[DECODE.getAudioBuffer().getOffset()];

            while (D.read(DD) != -1) {
                DataLineSource.write(DD, 0, DD.length);
            }
        }
    }
}
为啥没有TaskList<String>?,因为TaskList数据引入只是我们的一个有备而来的接口,它最后还是会变成流的方式进入mp3_Decode进行解码流程。并且它是线程安全的。
其实这里我写复杂了,可以更简单
参数Audio,音频输出类,存储方式,是否是本地引入/缓存引入(CacheData),缓存引入时,它只能执行转化程序。
->几个参数Audio,音频输出类,存储方式,是否是本地引入/缓存引入(CacheData),缓存引入时,它只能执行转化程序。
import IOS_SHOGUN_Component.*;
import IOS_SHOGUN_Component.decodeAean.AudioBuffer;
import IOS_SHOGUN_Component.decodeAean.Mp3DecodeException;
import java.io.*;
public class Java {

    public static void main(String[] X) throws IOException, Mp3DecodeException {
        //参数Audio,音频输出类,存储方式,是否是本地引入/缓存引入(CacheData),缓存引入时,它只能执行转化程序。
        mp3_Decode.Audio a=new mp3_Decode.Audio();
        mp3_Decode Create = new mp3_Decode(a, AudioBuffer.STREAM, mp3_Decode.LocalData);
        Create.open("流/路径", true);
        if (Create.onCreateAndStart()){
            //创建解码向导
        };
    }
}
我们再添加一点操作,因为在创建(onCreateAndStart)时,程序是阻塞的
import IOS_SHOGUN_Component.*;
import IOS_SHOGUN_Component.decodeAean.AudioBuffer;
import IOS_SHOGUN_Component.decodeAean.Mp3DecodeException;
import java.io.*;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.TimeUnit;

public class Java {

    public static void main(String[] X) throws IOException, Mp3DecodeException {
        SequenceCachedPool C=new SequenceCachedPool(1,2,100, TimeUnit.MILLISECONDS,
                new LinkedBlockingDeque<>(10));//创建一个池做操作控制
        //参数Audio,音频输出类,存储方式,是否是本地引入/缓存引入(CacheData),缓存引入时,它只能执行转化程序。
        mp3_Decode.Audio a=new mp3_Decode.Audio();
        mp3_Decode Create = new mp3_Decode(a, AudioBuffer.STREAM, mp3_Decode.LocalData);
        Create.open("流/路径", true);
        C.submit(()->{
            try {
                TimeUnit.SECONDS.sleep(5);
                Create.close();
                //5秒后退出
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        });
        if (Create.onCreateAndStart()){
            //创建解码向导
        };
    }
}

更推荐这样做

我更加的推荐把它当作一个转化程序,去做,因为它本身的任务不是播放。
这些是额外附加的。
getBase64Statistics(专为PCM-Base64数据做统计),像这样的专项API还有很多
java音频解码,Colorful框架,框架,Java,pcm,音视频,java,后端,开发语言,Powered by 金山文档

代码

import IOS_SHOGUN_Component.*;
import IOS_SHOGUN_Component.decodeAean.AudioBuffer;
import IOS_SHOGUN_Component.decodeAean.Mp3DecodeException;
import java.io.*;
public class Java {

    public static void main(String[] X) throws IOException, Mp3DecodeException {
        //注意这里必须是AudioBuffer.BASE64,不然不管以任何方式获取base64的PCM纯音频数据都将为空!
        mp3_Decode Create = new mp3_Decode(new mp3_Decode.Audio(), AudioBuffer.BASE64, mp3_Decode.LocalData);
        Create.open("D:\\WindowsDataStorageFolder\\CSDN2.mp3", false);//为false只做转化
        if (Create.onCreateAndStart()){
            TaskList<String> Data=Create.getPCM_dataLine().getPcmDataTaskList();
            //或者
            //TaskList<String> Data=Create.getPCM_DecodeSuperclasses().getAudioBuffer().getPcmDataTaskList();
            console.success("数据总长%s".formatted("PCM数据段总长->"+Data.getBase64Statistics()));
        };
    }
}

结尾

如果你喜欢的话就点个赞吧。文章来源地址https://www.toymoban.com/news/detail-616513.html

到了这里,关于Java Mp3转化WAV/PCM音频数据,解码详细解析,提取每一帧数据集合/比特流/播放,一行代码!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • mp3怎样才能转换成wav格式?音频互相转换的方法

    一,什么是WAV WAV,全称为波形音频文件(Waveform Audio File Format),是一种由微软公司和IBM公司联合开发的音频文件格式。自1991年问世以来,WAV格式因其无损的音频质量和广泛的兼容性,成为了多媒体应用中不可或缺的一部分。本文将从WAV格式的定义、特点、应用以及与其他音

    2024年04月14日
    浏览(52)
  • uniapp 微信小程序 使用video 播放mp3、wav、flac等音频文件 报错 MEDIA_ERR_DECODE(-11103,11010001)

     官方解释是解码发生了错误,当是我对音频文件进行转码后并未解决这个问题,但是我想到解决方案是使用audio 标签,但是样式又非常丑自能选择自己写,然后又出现个问题audio标签获取不了播放音频总时长,差点没缓过气来。。。最后苦思冥想到了解决方案,使用video标签

    2024年02月03日
    浏览(97)
  • C# 将音频PCM数据封装成wav文件

    之前实现了《C++ 将音频PCM数据封装成wav文件》,最近将其改成了C#版本。使用C#实现录音功能时还是需要写wav文件的,直接用C#实现也是比较简单的,这样可以免去不必要的依赖。 首先需要构造wav头部,wav文件音频信息全部保存在头部,我们要做的就是在PCM数据的前面加入w

    2024年02月07日
    浏览(38)
  • Unity AudioClip和PCM音频数据的转化

    1 PCM音频数据转化AudioClip   假设PCM音频当前是16Khz采样率,16bit数据 2 提取AudioClp中的数据转化为PCM bytes字节数组

    2024年02月05日
    浏览(40)
  • Android studio添加MP3音频文件(超详细教程)

    进入Android studio 在res下新建一个文件夹raw,右击res—— New ——Direclory 输入raw 再把MP3文件复制到raw就可以了。 这样就完成了。

    2024年02月11日
    浏览(50)
  • 三、pcm音频转wav

    ffmpeg录制下来的音频为pcm格式(内部存储着十六进制数据),但pcm格式的音频无法直接播放 本文先将pcm转换成wav格式(提要提前了解音频知识) 首先分析wav文件格式(wav的本质是在pcm数据前加上文件头),即在pcm的十六进制数据前加上文件头(文件头也是十六进制数据,但

    2023年04月08日
    浏览(41)
  • 音频格式(一)PCM和WAV

            想要了解音频首先要了解它的构造,知道它怎么从声音变成文件,又怎么从文件变成声音。文件格式根据需求和技术的进步有了不同的版本,不同的文件格式有其不同的文件构造。我们先从最原始的两种音频文件入手,讲一讲常见的音频文件格式。首先是PCM和WAV   

    2023年04月24日
    浏览(35)
  • java获取一段音频/mp3的时长

    引言 在日常开发中,经常会遇到产品经理提出一个需求“上传音乐/音频”,而且还得显示出音频的播放时长。那我们直接世界上最简单的实现方案,必须是最简单,多一句啰嗦不准点赞。 How to do 1.提前引入包 2.逻辑实现

    2024年01月25日
    浏览(39)
  • ffmpeg批量转换wav为mp3

    1、新建一个txt文件,并复制如下代码进入,然后保存。 2、把文件后缀修改为bat 。 3、把后缀为bat的文件放到要批量处理的视频文件夹里面。 4、在确保安装了ffmpeg的情况下,双击bat文件执行即可。 5、参数说明: -i          输入文件,这里指的就是视频文件。 -y       

    2024年01月20日
    浏览(52)
  • CTF工具音频隐写神器MP3stego安装和详细使用方法

    MP3stego 是一个在通用的 MP3 音频文件中隐写的软件,对MP3进行隐写。 官网下载地址:https://www.petitcolas.net/steganography/mp3stego/ 常用参数: -E 进行加密 -P 输入密码 -X 进行提取 使用的话就是把文件放入一个目录下 加密或者解密 很简单就两条命令 没难度。 这里看一道题目:[FSC

    2024年02月03日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包