【发布时间】:2018-10-23 17:44:45
【问题描述】:
我有十几个或更多 mp3 音频文件,我需要将它们连接成一个 mp3 文件。这些文件都具有相同的比特率 (320 kbps) 和采样率 (44.1 kHz),但它们都有不同的持续时间。
我研究了 stackoverflow (How to concatenate two MP4 files using FFmpeg) 上推荐的三种连接方法。一种方法确实有效,但是当我播放输出文件时,我发现每个连接点都有明显的音频伪影(可听见的故障)。
有人告诉我这个问题是由输入文件的持续时间不同引起的。这似乎很可能,因为我在连接具有相同比特率、采样率和持续时间的音频文件方面取得了一些成功。
我在网上看到了一些更复杂的脚本,目前这些脚本超出了我的理解范围。我被引导到的一个解决方案需要相当深入的 Python 知识!
但是,我的研究还包括一个位于 audio-joiner.com 的站点 - 这是我迄今为止发现的唯一完全成功的方法,用于处理不同持续时间的文件。该站点处理了我的一些输入文件,将多个文件合并为一个,并且它生成的连接输出文件在连接处没有任何可听见的故障。
我查看了网站正在使用的流程,希望能找到我哪里出错的线索,但是网站上的脚本(看起来像基于 ajax 的 javascript)对我来说太复杂了.
因为这个过程似乎需要相当长的时间,所以当我得知 mp3 输入文件被转换为其他音频格式、加入,然后再转换回 mp3 以进行输出时,我不会感到太惊讶。但如果是这样,那不会让我停止使用这个过程。
有没有人熟悉正在使用的方法,并且可以说它是否可以使用 ffmpeg 重现?
.
添加 -
相关页面的源代码中总共列出了 7 个脚本:
https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.0/jquery.min.js
https://static.123apps.com/js/socket.io.js
https://static.123apps.com/js/shared_0.js
https://static.123apps.com/js/shared_1.js
https://static.123apps.com/js/ajoiner.js
https://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js
.
添加 -
成功的(javascript)函数似乎是这样,但我不清楚它为什么成功(对我来说太复杂了!)。谁能建议它采取什么方法?比如是把mp3文件转码成中间格式,然后拼接中间文件?
function start_join(e){
l("start_join():"),l(e);
var t;
return(t=$.parseJSON(e)) && $("#ajoiner").ajoiner("set_params",t),!0
}
function cancel_join(e){
return l("cancel_join():"),l(e),!0
}
!function(o){
var t={
init:function(e){
var t=o(this),n=o.extend({lang:{cancel:"Cancel",download:"Download"}},e);
o(this).data("ajoiner",{o:n,tmp_i:1,pid:-1,params:{}});
t.data("ajoiner");
t.ajoiner("_connect"),o("body").bind("socket_connected",function(){t.ajoiner("_connect")})
},set_params:function(e){
var t=o(this).data("ajoiner");
isset(e)?(e.uid=Cookies.get("uid"),t.params=e,t.params.lang_id=lang_id,t.params.host=location.hostname,t.params.hostprotocol=location.protocol,l("socket emit join:"),l(t.params),socket.emit("join",t.params)):error("set_params: params not set")
},_connect:function(){
var t=o(this).data("ajoiner");
l("_connect"),socket.on("join",function(e){
"progress"==e.message_type?(t.tmp_i,t.tmp_i++,void 0!==getObj("theSWF")&&(getObj("theSWF").set_join_progress(parseInt(e.progress_value)),l("SWF.set_join_progress("+parseInt(e.progress_value)+")")),isset(e.pid)&&(t.pid=e.pid)):"final_result"==e.message_type?(void(e.tmp_i=0)!==getObj("theSWF")&&(getObj("theSWF").join_finished(o.stringifyJSON(e)),l("SWF.join_finished('"+o.stringifyJSON(e)+"')")),last_conv_result=e):"error"==e.message_type&&l(e.error_desc)
}
)},_cancel_convert:function(){
var e=o(this).data("ajoiner");
0<e.pid&&socket.emit("cancel_convert",{pid:e.pid})
}
};
o.fn.ajoiner=function(e){
return t[e]?t[e].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof e&&e?void o.error("Method "+e+" does not exist"):t.init.apply(this,arguments)
}
}
(jQuery),$(document).ready(function(){$("#ajoiner").ajoiner()});
【问题讨论】:
-
你能链接到网站脚本吗?
-
我认为它的static.123apps.com/js/ajoiner.js 术语“ajoiner”在他们网站的其他地方被用作他们“audio joiner”功能的简写。
-
@Ed999 你尝试了哪些 ffmpeg concat 方法?
-
我尝试了以下所有 3 种方法,最后一种方法有效,但它在连接点留下了短暂的间隙(导致可听见的故障):stackoverflow.com/questions/7333232/…
-
为免生疑问,我需要一个适用于 Windows 7 的解决方案。有问题的 3 种方法是在相关页面上的 accepted 答案中描述的方法,即由 rogerdpack 于 2012 年 6 月 24 日发布(concat 过滤器、concat demuxer、concat 协议) .
标签: javascript audio ffmpeg