繁体   English   中英

ffmpeg 可以使用 audio-joiner.com 上的过程连接 mp3 文件吗?

[英]Can ffmpeg concatenate mp3 files using the process at audio-joiner.com?

我有十几个或更多的 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()});

上面有一个很小的 ​​python 脚本可以用 ffmpeg 做这样的事情。
该脚本被配置为在您的 mp3 的同一文件夹中运行,但您可以进行调整。

import os

def main():

    # ::.inputs
    extensions = '.mp3'
    path_folder_input = '.'
    path_file_output = 'set_joined.mp3'

    # ::. Make a path_file list
    list_files = []
    for root, dirs, files in os.walk(path_folder_input):
        for file in files:
            if file.endswith(extensions):
                print(file)
                list_files.append(os.path.join(root, file))

    # ::. Make a ffmpeg command
    index_final = len(list_files)-1
    stringa = "ffmpeg -i \"concat:"
    for index, path_file in enumerate(list_files):
        stringa += path_file
        if index != index_final:
            stringa += "|"
        else:
            stringa += f"\" -acodec copy " + \
                       f"{path_file_output}"

    # ::. Start join
    os.system(stringa)


main()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM