Проблемы с конкатенацией файлов (mp3) с использованием FFmpeg

#audio #ffmpeg #concatenation #mp3 #codec

#Аудио #ffmpeg #конкатенация #mp3 #кодек

Вопрос:

Я хочу объединить некоторые файлы MP3, используя протокол конкатенации FFmpeg.

Вот успешная попытка:

 $ ffmpeg -loglevel panic -i "concat:audio/it/ci.mp3|audio/it/èsse.mp3|audio/it/cu.mp3|audio/it/u.mp3|audio/it/tre.mp3|audio/it/zero.mp3|audio/it/cinque.mp3|audio/it/quattro.mp3|audio/it/tre.mp3|audio/it/otto.mp3|audio/it/tre.mp3" -c copy audio/it/CSQU3054383.mp3 -y

$ ll audio/it/CSQU3054383.mp3
-rw-rw-r-- 1 giorgio 26K Nov  9 16:16 audio/it/CSQU3054383.mp3
  

Пока все в порядке!

Кстати, все файлы (Mp3) имеют одинаковые кодеки, поэтому протокол конкатенации MP3 FFmpeg работает должным образом!


Теперь я хочу вставить файл паузы audio/it/PAUSE_2.mp3 между каждым предыдущим файлом:

 $ ffmpeg -loglevel panic -i "concat:audio/it/ci.mp3|audio/it/PAUSE_2.mp3|audio/it/èsse.mp3|audio/it/PAUSE_2.mp3|audio/it/cu.mp3|audio/it/PAUSE_2.mp3|audio/it/u.mp3|audio/it/PAUSE_2.mp3|audio/it/tre.mp3|audio/it/PAUSE_2.mp3|audio/it/zero.mp3|audio/it/PAUSE_2.mp3|audio/it/cinque.mp3|audio/it/PAUSE_2.mp3|audio/it/quattro.mp3|audio/it/PAUSE_2.mp3|audio/it/tre.mp3|audio/it/PAUSE_2.mp3|audio/it/otto.mp3|audio/it/PAUSE_2.mp3|audio/it/tre.mp3" -c copy audio/it/CSQU3054383.mp3 -y
$
  

Эта команда выполняется, по-видимому, без каких-либо ошибок, но выходной файл ( audio/it/CSQU3054383.mp3 ) вообще не генерируется.

** Вопрос 1 (второстепенный):

Почему FFmpeg не сообщает о какой-либо ошибке и не выдает ожидаемый результат?**

На самом деле, я уже сталкивался с тем, что FFmpeg при некоторых обстоятельствах терпит неудачу, не объясняя причины : (


Я подозреваю, что проблема возникает из-за того, что файл audio/it/PAUSE_2.mp3 не имеет постоянной скорости передачи данных (CBR), как другие файлы, например:

 $ mediainfo  audio/it/ci.mp3
General
Complete name                            : audio/it/ci.mp3
Format                                   : MPEG Audio
File size                                : 2.06 KiB
Duration                                 : 528 ms
Overall bit rate mode                    : Constant
Overall bit rate                         : 32.0 kb/s

Audio
Format                                   : MPEG Audio
Format version                           : Version 2
Format profile                           : Layer 3
Duration                                 : 528 ms
Bit rate mode                            : Constant
Bit rate                                 : 32.0 kb/s
Channel(s)                               : 1 channel
Sampling rate                            : 24.0 kHz
Frame rate                               : 41.667 FPS (576 SPF)
Compression mode                         : Lossy
Stream size                              : 2.06 KiB (100%)

$ ffprobe audio/it/ci.mp3
ffprobe version 3.4.8-0ubuntu0.2 Copyright (c) 2007-2020 the FFmpeg developers
  built with gcc 7 (Ubuntu 7.5.0-3ubuntu1~18.04)
  configuration: --prefix=/usr --extra-version=0ubuntu0.2 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
  libavutil      55. 78.100 / 55. 78.100
  libavcodec     57.107.100 / 57.107.100
  libavformat    57. 83.100 / 57. 83.100
  libavdevice    57. 10.100 / 57. 10.100
  libavfilter     6.107.100 /  6.107.100
  libavresample   3.  7.  0 /  3.  7.  0
  libswscale      4.  8.100 /  4.  8.100
  libswresample   2.  9.100 /  2.  9.100
  libpostproc    54.  7.100 / 54.  7.100
[mp3 @ 0x564491288080] Estimating duration from bitrate, this may be inaccurate
Input #0, mp3, from 'audio/it/ci.mp3':
  Duration: 00:00:00.53, start: 0.000000, bitrate: 32 kb/s
    Stream #0:0: Audio: mp3, 24000 Hz, mono, s16p, 32 kb/s

  

Вместо этого вставленный файл pause имеет переменную скорость передачи данных, как утверждает mediainfo:

 $ mediainfo audio/it/PAUSE_2.mp3
General
Complete name                            : audio/it/PAUSE_2.mp3
Format                                   : MPEG Audio
File size                                : 8.29 KiB
Overall bit rate mode                    : Variable
Writing library                          : LAME3.100

Audio
Format                                   : MPEG Audio
Format version                           : Version 2
Format profile                           : Layer 3
Bit rate mode                            : Variable
Channel(s)                               : 1 channel
Sampling rate                            : 24.0 kHz
Compression mode                         : Lossy
Stream size                              : 8.06 KiB (97%)
Writing library                          : LAME3.100
  

Here my Bash script I used to generate the pause:

 $ cat com/pause
#!/bin/bash

# https://ffmpeg.org/ffmpeg-filters.html#toc-anullsrc
# https://ffmpeg.org/ffmpeg-utils.html#toc-Examples-1

if [ $# -eq 0 ]
  then
    echo
    echo "create a pause, a silence audio file (MP3) of specified number of milliseconds"
    echo
    echo "usage: $0 <time duration (in seconds)> <directory path>"
    echo
    echo "example: $0 2"
    echo "example: $0 0.5 tmp/"
    echo
    exit
fi

timeDuration=$1
directoryPath=$2

suffix=mp3

# https://trac.ffmpeg.org/wiki/Limiting the output bitrate
#https://trac.ffmpeg.org/wiki/Encode/MP3
bitrate=32k
samplingRate=24000
outputFile="${directoryPath}PAUSE_${timeDuration}.${suffix}"

  #-b:a $bitrate -minrate $bitrate -maxrate $bitrate -bufsize $bitrate 
ffmpeg 
  -f lavfi 
  -i anullsrc=r=$samplingRate:cl=mono 
  -t $timeDuration 
  -b:a $bitrate -minrate $bitrate -maxrate $bitrate 
  -codec:a libmp3lame 
  $outputFile -y

echo
echo "created file: $outputFile"
echo

  

К сожалению, созданный файл отображается с переменной скоростью передачи данных, а не с постоянной скоростью передачи данных (CBR), как ожидалось ( -b: a … ):

 $ com/pause 2
ffmpeg version 3.4.8-0ubuntu0.2 Copyright (c) 2000-2020 the FFmpeg developers
  built with gcc 7 (Ubuntu 7.5.0-3ubuntu1~18.04)
  configuration: --prefix=/usr --extra-version=0ubuntu0.2 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
  libavutil      55. 78.100 / 55. 78.100
  libavcodec     57.107.100 / 57.107.100
  libavformat    57. 83.100 / 57. 83.100
  libavdevice    57. 10.100 / 57. 10.100
  libavfilter     6.107.100 /  6.107.100
  libavresample   3.  7.  0 /  3.  7.  0
  libswscale      4.  8.100 /  4.  8.100
  libswresample   2.  9.100 /  2.  9.100
  libpostproc    54.  7.100 / 54.  7.100
Input #0, lavfi, from 'anullsrc=r=24000:cl=mono':
  Duration: N/A, start: 0.000000, bitrate: 192 kb/s
    Stream #0:0: Audio: pcm_u8, 24000 Hz, mono, u8, 192 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (pcm_u8 (native) -> mp3 (libmp3lame))
Press [q] to stop, [?] for help
Output #0, mp3, to 'PAUSE_2.mp3':
  Metadata:
    TSSE            : Lavf57.83.100
    Stream #0:0: Audio: mp3 (libmp3lame), 24000 Hz, mono, s16p, 32 kb/s
    Metadata:
      encoder         : Lavc57.107.100 libmp3lame
size=       8kB time=00:00:02.01 bitrate=  33.7kbits/s speed= 192x
video:0kB audio:8kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 2.870640%

created file: PAUSE_2.mp3
  

Вопрос 2:

Что не так в моем скрипте Bash (почему он не генерирует файл CBR? Как я могу сгенерировать файл паузы молчания (молчание N миллисекунд) с точными настройками предыдущих файлов?

Комментарии:

1. Что выводится ffmpeg -i для файла до и после?

2. ранее: добавлен ffprobe. После: файл не создан! (плохое управление ошибками ffmpeg). Вопрос 2: Я решил установить в моем скрипте битрейт = 64 кб): для обеспечения постоянной скорости передачи данных (CBR) работает -b: 64 кб (скорость передачи данных> = 64000), но -b: 32 кб не работает (это создает VBR). Мне не совсем понятно.