LINUX.ORG.RU

ffmpeg

 


0

1

Приветствую. Возможно, кто-то знает как решить силами ffmpeg следующую задачу, гуглинг особо ничем не помог:

Есть mp3, например длительностью 600 сек - main.mp3 Есть еще несколько mp3, разной длительностью по 1-5 сек - 1.mp3, 2.mp3, n.mp3…

Нужно наложить мелкие mp3 на основной большой.

Например, наложить 1.mp3 на main.mp3, начиная с 40 секунды; наложить 2.mp3 на main.mp3, начиная с 500 секунды, и тп. Начальная секунда (позиция) заранее неизвестна, как и количество мелких файлов, которые нужно наложить.

Буду признателен за любую помощь.

$ cat list.txt 
main.mp3|0
1.mp3|40
2.mp3|500
n.mp3|35231
$ ./ffmix.sh list.txt result.mp3 -y -b:a 64k
Done.

ffmix.sh:

#!/usr/bin/bash

# Parameters:
#   $1    - input list; each line in the "file|delay" format;
#           "delay" is in seconds.
#   $2    - output file; encoder is chosen by extension, 
#           e.g. "output.mp3".
#   $3... - rest arguments are passed to ffmpeg directly.
#
# Example:
#   ./ffmix.sh list.txt result.mp3 -b:a 64k -y

i=0
inputs=()
delays=()
delayed_inputs=()
args=("$@")

while IFS='|' read file delay; do
    inputs+=("-i" "${file}")
    delays+=("[${i}]adelay=$((delay*1000)):1[${i}d];")
    delayed_inputs+=("[${i}d]")
    i=$((i+1))
done < "${args[0]}"

ffmpeg -loglevel warning \
    "${inputs[@]}" \
    -filter_complex "${delays[*]} ${delayed_inputs[*]} amix=inputs=${i}" \
    "${args[@]:2}" "${args[1]}"

echo Done.

С вас $15 :)

anonymous ()