做过音频处理的朋友进来一下

dahuatttt 2013-09-22 09:59:59
问题1: 2个假设同编码同设置的音频文件要混合成1个音频文件,是否还是需要先解码成pcm后再混?或者说各有各的处理比如mp3和ogg。

问题2: 假设无论如何都需要先解码,2段pcm用什么算法混一起?

问题3: 假设无论如何都需要先解码再混合再编码,多次之后是不是音质下降严重(因为每次重新编码都应该会造成质量损失吧?)

问题4: ogg有没有相关函数可以做这事?
...全文
310 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiandingzhe 2013-09-26
  • 打赏
  • 举报
回复
引用 7 楼 dahuatttt 的回复:
[quote=引用 6 楼 jiandingzhe 的回复:] [quote=引用 4 楼 dahuatttt 的回复:] [quote=引用 2 楼 jiandingzhe 的回复:] 当然总是从压缩的数据(ogg、mp3等)转成非压缩的时间-幅度数据,然后再做处理。 是否能直接处理,要看位数、采样率是否一致。如果不一致就要转化成一致的才行,比如时间上差值、幅度上缩放。 反复解压、修改、再压缩,质量会下降。如果只是对完全一样的数据,用完全一样的方法压缩、解压,质量不会下降。
谢谢。顺带问下采样率放大用什么算法?比如22050放大到44100。
引用 3 楼 jiandingzhe 的回复:
另外,混一起你直接取平均值就行了啊
取平均好奇怪啊!那我先测试下吧。[/quote] 采样率放大不需要复杂的算法,通常用线性插值就行。如果觉得不爽就用更高端的,二次插值什么的。 混一起当然是取平均了。混一起之前,注意区分声道。文件通常都是俩声道的。如果你要写适应性更强的代码,就要读取文件的声道数,然后按那个处理声道。[/quote] 谢谢。 刚要动手又想到一个混合的问题。。。16位采样的数据,是16位作为一个整数去计算还是作为2个signed char分别算,还是16位作为一个float去算?[/quote] 当然不可能是两个signed char。 具体是16位整形还是半精度浮点,这都是可能的,取决于原本是怎么存储的。
赵4老师 2013-09-25
  • 打赏
  • 举报
回复
引用 12 楼 dahuatttt 的回复:
引用 11 楼 zhao4zhong1 的回复:
推荐使用NCTAudioStudio控件处理音频。
看到价格退缩了。
搜破解版不难吧。
dahuatttt 2013-09-25
  • 打赏
  • 举报
回复
引用 15 楼 zhao4zhong1 的回复:
有人告你侵犯版权说明你发了!
言之有理。。。
赵4老师 2013-09-25
  • 打赏
  • 举报
回复
有人告你侵犯版权说明你发了!
dahuatttt 2013-09-25
  • 打赏
  • 举报
回复
引用 13 楼 zhao4zhong1 的回复:
引用 12 楼 dahuatttt 的回复:
[quote=引用 11 楼 zhao4zhong1 的回复:] 推荐使用NCTAudioStudio控件处理音频。
看到价格退缩了。
搜破解版不难吧。[/quote]我胆小,怕人家告我。。。不过算法简单的自己也就那么搞下了。
dahuatttt 2013-09-24
  • 打赏
  • 举报
回复
引用 11 楼 zhao4zhong1 的回复:
推荐使用NCTAudioStudio控件处理音频。
看到价格退缩了。
赵4老师 2013-09-24
  • 打赏
  • 举报
回复
推荐使用NCTAudioStudio控件处理音频。
aizibion 2013-09-23
  • 打赏
  • 举报
回复
其他不清楚,但这点可以肯定 “假设无论如何都需要先解码再混合再编码,多次之后是不是音质下降严重” 如果不是采用有损压缩算法,多次编解码并不会造成质量下降。
dahuatttt 2013-09-23
  • 打赏
  • 举报
回复
引用 6 楼 jiandingzhe 的回复:
[quote=引用 4 楼 dahuatttt 的回复:] [quote=引用 2 楼 jiandingzhe 的回复:] 当然总是从压缩的数据(ogg、mp3等)转成非压缩的时间-幅度数据,然后再做处理。 是否能直接处理,要看位数、采样率是否一致。如果不一致就要转化成一致的才行,比如时间上差值、幅度上缩放。 反复解压、修改、再压缩,质量会下降。如果只是对完全一样的数据,用完全一样的方法压缩、解压,质量不会下降。
谢谢。顺带问下采样率放大用什么算法?比如22050放大到44100。
引用 3 楼 jiandingzhe 的回复:
另外,混一起你直接取平均值就行了啊
取平均好奇怪啊!那我先测试下吧。[/quote] 采样率放大不需要复杂的算法,通常用线性插值就行。如果觉得不爽就用更高端的,二次插值什么的。 混一起当然是取平均了。混一起之前,注意区分声道。文件通常都是俩声道的。如果你要写适应性更强的代码,就要读取文件的声道数,然后按那个处理声道。[/quote] 谢谢。 刚要动手又想到一个混合的问题。。。16位采样的数据,是16位作为一个整数去计算还是作为2个signed char分别算,还是16位作为一个float去算?
jiandingzhe 2013-09-23
  • 打赏
  • 举报
回复
引用 4 楼 dahuatttt 的回复:
[quote=引用 2 楼 jiandingzhe 的回复:] 当然总是从压缩的数据(ogg、mp3等)转成非压缩的时间-幅度数据,然后再做处理。 是否能直接处理,要看位数、采样率是否一致。如果不一致就要转化成一致的才行,比如时间上差值、幅度上缩放。 反复解压、修改、再压缩,质量会下降。如果只是对完全一样的数据,用完全一样的方法压缩、解压,质量不会下降。
谢谢。顺带问下采样率放大用什么算法?比如22050放大到44100。
引用 3 楼 jiandingzhe 的回复:
另外,混一起你直接取平均值就行了啊
取平均好奇怪啊!那我先测试下吧。[/quote] 采样率放大不需要复杂的算法,通常用线性插值就行。如果觉得不爽就用更高端的,二次插值什么的。 混一起当然是取平均了。混一起之前,注意区分声道。文件通常都是俩声道的。如果你要写适应性更强的代码,就要读取文件的声道数,然后按那个处理声道。
dahuatttt 2013-09-23
  • 打赏
  • 举报
回复
顺带问下采样率放大用什么算法?比如22050放大到44100。 -〉我的意思是中间插值的算法。也用前后样本取平均插进去?
dahuatttt 2013-09-23
  • 打赏
  • 举报
回复
引用 2 楼 jiandingzhe 的回复:
当然总是从压缩的数据(ogg、mp3等)转成非压缩的时间-幅度数据,然后再做处理。 是否能直接处理,要看位数、采样率是否一致。如果不一致就要转化成一致的才行,比如时间上差值、幅度上缩放。 反复解压、修改、再压缩,质量会下降。如果只是对完全一样的数据,用完全一样的方法压缩、解压,质量不会下降。
谢谢。顺带问下采样率放大用什么算法?比如22050放大到44100。
引用 3 楼 jiandingzhe 的回复:
另外,混一起你直接取平均值就行了啊
取平均好奇怪啊!那我先测试下吧。
jiandingzhe 2013-09-23
  • 打赏
  • 举报
回复
另外,混一起你直接取平均值就行了啊
jiandingzhe 2013-09-23
  • 打赏
  • 举报
回复
当然总是从压缩的数据(ogg、mp3等)转成非压缩的时间-幅度数据,然后再做处理。 是否能直接处理,要看位数、采样率是否一致。如果不一致就要转化成一致的才行,比如时间上差值、幅度上缩放。 反复解压、修改、再压缩,质量会下降。如果只是对完全一样的数据,用完全一样的方法压缩、解压,质量不会下降。
dahuatttt 2013-09-23
  • 打赏
  • 举报
回复
求平均效果不太好,目前还在摸索中。贴一些我查到的资料给后人吧 讨论: http://bbs.csdn.net/topics/70098987 http://www.audiobar.net/viewthread.php?tid=121485 http://stackoverflow.com/questions/376036/algorithm-to-mix-sound 常用的混音算法: http://shanewfx.github.io/blog/2013/08/14/caprure-audio-on-windows/ [荐] http://www.cppblog.com/jinq0123/archive/2007/10/31/AudioMixingStudy.html http://blog.csdn.net/leohwang/article/details/7517476 http://hi.baidu.com/285988185/item/1ca1eb464905e5096cc2f0fb 某算法代码: http://www.sf.org.cn/Article/multimedia/200511/14267.html http://blog.sina.com.cn/s/blog_4d61a7570101arsr.html 研究: http://blog.csdn.net/blade2001/article/details/7163352 http://wenku.baidu.com/view/46cd4b0ef12d2af90242e631.html
dahuatttt 2013-09-23
  • 打赏
  • 举报
回复
人工置顶下...
dahuatttt 2013-09-23
  • 打赏
  • 举报
回复
人工置顶...
一直以来, 在多媒体播放器这块, 即使目前有许多开源的播放器项目, 但要写一个播放器仍然是件非常困难的事, 如果在windows上你有可能需要熟悉DShow, 另外的话, 你需要学习一堆开源项目(比如FFmpeg, MPC, VLC, Mplayer), 而且多数都是基于linux, 在windows上学习起来很不容易, 然而这些开源项目对于一些希望快速实现自己播放器, 就显得很困难. 因此, 我创建了这个项目, 致力于以最简单的方法实现自己的播放器, 并提供一个可以很方便使用的接口. 目前, 在这个代码中, 主要链接到FFmpeg来进行解码, 并将其改造成一个通用的播放器框架. 在这个框架中能够接受各种数据的读入, 可以很方便的封装自己的数据读取模块, 也可以很方便的定制自己的视频渲染模块和音频播放模块, 你只需要参考其中的实现即可. 另外在当前的实现中, 因为个人精力实在有限, 所以借鉴了一些开源项目的代码(如Mplayer), 并且该代码主要基于windows平台, 有移植到linux等其它平台的打算. 所以, 我希望有朋友能参与到这个项目中一起研究和学习, 并完成这个目标. 在 https://github.com/Jackarain/avplayer/downloads 中有已经编译好的exe可供测试, 测试命令如下: avplayer.exe test.mp4 或者 avplayer.exe http://edstream.googlecode.com/files/stream.m3u8 或者 avplayer.exe gq.flv.torrent gq.flv.torrent 是从优酷找的一个超清视频文件做的种子. 整个项目分为几个模块: 1. avcore 这只是一个包装类, 实现windows上的窗口创建以及消息响应, 比如: 右击暂停/开始, 单击按屏幕宽百分比seek, F2全屏切换. 在这个模块中, avplayer类是外部接口类, 具体实现在player_impl类中. 在player_impl类中, 初始化各模块结构指针由下面几个函数实现, void init_file_source(media_source *ms); void init_audio(audio_render *ao); void init_video(video_render *vo); 你可以根据自己的需求来修改这些函数实现. media_source是一个提供数据访问的结构, 包含一些函数指针, 如果你需要重新从其它地方读取数据进来提供给播放器, 那么你可以参照这个结构体, 实现这些函数并指向它, 就可以获得从你指定的地方读取数据来进行播放, 这里实现了一个从文件读取数据播放的dll. audio_render是用于播放音频的结构, 同样包含了一些函数指针, 只要实现这些函数指针, 就可以改变音频输出, 比如把音频数据写到文件, 这里实现了2种方式输出音频, 一种是使用dsound来输出音频, 另一种是使用waveout来输出音频. video_render是用于渲染视频的结构, 原理同上, 需要注意的是render_one_frame的data是YUV420格式. 2. libav 这是一个基于ffmpeg的播放框架, 该框架不包含视频渲染和音频播放以及数据读取, 若需要可以实现上述结构体各函数即可, 这个框架中主要完成了使用ffmpeg解码, 以及音视频同步, seek操作处理, 并提供一些基本的控制播放器的函数(在avplay.h中定义). 3. audio 是一个音频播放输出模块实现, 主要实现了audio_render中那几个函数指针. 在这个模块中实现了2套音频输出dsound和waveout. 4. video 是一个视频渲染模块的实现, 实现了video_render中的那几个函数指针. 在这个模块中, 实现了3套视频渲染输出d3d, ddraw, opengl这些方式(还有gdi方式渲染没有添加到video_out.h中). 5. avplayer 是一个使用avcore实现一个简单播放器的示范, 如果要创建一个播放器, 只需要avplayer.h, 然后使用创建一个avplayer对象, 就可以创建一个播放器, 关于如何使用avcore的具体细节可以参考avplayer/main.cpp. 最后, 任何方式(包括商业或非商业)修改或引用该项目的全部或部分源码(或dll), 请在你的软件中或产品文档中必须清楚的声明引用了该项目, 并注明url(https://github.com/Jackarain/avplayer), 你可以偷偷的不这样做, 但这样做是令人欣赏的做法. 最后本程序作者不承担使用该程序所带来的任何问题并拥有一切解释权. mail: jack.wgm@gmail.com

65,199

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧