【技术笔记】实现一个非常简易的flac裁剪并转换为wav格式

版权声明:尊重博主原创文章,转载请注明出处 https://blog.csdn.net/weixin_39020940/article/details/85416279

最近项目中遇到了一个需求是要实现对Flac歌曲的裁剪,而且不能是GPL开源协议的软件,网上查了一下,foolbar和千千静听都是会支持,其中foolbar是开放源代码的,下载代码看了发现是使用的libflac(后来我又找了两个支持flac格式裁剪的mp3splt和pysourcefile,发现都是使用libflac),于是决定研究一下怎么使用libflac实现。

libflac还有衍生的libflac++是BSD协议,而衍生的工具flac和metaflac则是GPL协议的

下载下来libflac后,最初是在linux上编译的,发现始终编译不通过,应该是缺少libtool,看了软件包提供多个平台的编译文件,就先试试集成性比较好的win,打开之后工程如下:

除了上面说到的几个工程外,还有几个是测试工程和示例工程

win启动后发现还是编译不通过,报错缺少nasm.exe,参考博客https://blog.csdn.net/dragoo1/article/details/22396325下载后搞定

再编译发现报错为缺少ogg.h头文件,查了一下也是歌曲编码相关的,是BSD协议,下载下来后先编译libogg,编译完成后拷贝到libflac下面,再编译libflac,这次编译通过了

接下来看了下示例工程example_c_decode_file,发现是实现flac转wav的,可以直接编译,编译完测了下功能,稳稳地^ ^

看了下样例代码,发现是通过注册函数到libflac,通过libflac一帧一帧(这里是不是帧大小有待商榷,反正理解这个意思就行了)

本来想参考mp3splt的调用方法,看到这个发现修改这里就可以实现一个的(真正的程序员要学会规避风险,避免投入大于产出^ ^)

先随便写一个,这个歌曲的framesize是2183,跳过开头的100和2000以后的,果然被裁剪掉了

原歌曲长度是3分48秒

裁剪后变成了3分18秒

这里稍稍研究了一下,这个歌曲的总samples是10056067,每个frame下面的sample个数是4608,所以总共有2183个frame,另外它的samplerate是44100,所以歌曲总长度是228秒,即3分48秒,我跳过了前100和后183,共283*4608个sample,而时长就是(283*4608)/44100≈30s,这个实际查询的结果是相符的,说明我裁剪ok了

由于示例代码比较简单,所以它也有几个限制:

1、只能处理channels为2和16bits的

2、使用小端字节序

 

【附】

1、示例解码代码中使用的libflac的api和它的功能

FLAC__stream_decoder_new                --创建一个解码器
FLAC__stream_decoder_set_md5_checking   --设置是否md5校验检查
FLAC__stream_decoder_init_file(         --初始化,注册函数
    decoder,                            --解码器
    argv[1],                            --目标flac文件
    write_callback,                     --写回调
    metadata_callback,                  --只回调一次,可以获取到歌曲文件的信息
    error_callback,                     --错误时回调,可以通过FLAC__StreamDecoderErrorStatusString获取原因
    /*client_data=*/fout);

FLAC__stream_decoder_process_until_end_of_stream    --启动解码
FLAC__stream_decoder_delete             --删除解码器

 

猜你喜欢

转载自blog.csdn.net/weixin_39020940/article/details/85416279
今日推荐