Микширование аудиопотока FLV с фоновой дорожкой WAV и преобразование в MP3 с SoX и FFmpeg - PullRequest
1 голос
/ 17 ноября 2011

Я создаю приложение для записи на основе Flash для сайта по контракту Он передает записанный голос (через SWF) на сервер Red5, а затем использует комбинацию FFmpeg и SoX, чтобы скомпилировать вокальный звук с фоновой музыкальной дорожкой с меньшей громкостью. Все это должно происходить по требованию, то есть, когда пользователь «сохраняет» свою вокальную запись.

Вот пример команды, которую я буду выполнять. Имена были изменены, чтобы защитить невинных. Имена файлов описывают их роль в конечном файле:

sox --combine mix -p --no-show-progress --norm "|ffmpeg -i /usr/share/red5/webapps/audiorecorder/stream/SPOKEN_VOICE.flv -t wav pipe:1" /var/www/ufiles/music/BACKGROUND_MUSIC.wav - | ffmpeg -i pipe:1 /var/www/ufiles/recordings/COMPILED_AUDIO_RECORDING.mp3

Когда я запускаю эту команду в оболочке, вот что происходит:

$ sox --combine mix -p --no-show-progress --norm "|ffmpeg -i audioStream_1321399534128_21.flv -ar 44100 -ac 2 -t wav pipe:1" wrong.wav - | ffmpeg -i pipe:1 ~/www/trauma101.com/compiled.mp3
ffmpeg version N-34884-g7575980, Copyright (c) 2000-2011 the FFmpeg developers
  built on Nov 15 2011 14:06:49 with gcc 4.4.5
  configuration: --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-libfaac --enable-libmp3lame --enable-libx264 --enable-x11grab --enable-libspeex
  libavutil    51. 25. 0 / 51. 25. 0
  libavcodec   53. 34. 0 / 53. 34. 0
  libavformat  53. 20. 0 / 53. 20. 0
  libavdevice  53.  4. 0 / 53.  4. 0
  libavfilter   2. 48. 1 /  2. 48. 1
  libswscale    2.  1. 0 /  2.  1. 0
  libpostproc  51.  2. 0 / 51.  2. 0
ffmpeg version N-34884-g7575980, Copyright (c) 2000-2011 the FFmpeg developers
  built on Nov 15 2011 14:06:49 with gcc 4.4.5
  configuration: --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-libfaac --enable-libmp3lame --enable-libx264 --enable-x11grab --enable-libspeex
  libavutil    51. 25. 0 / 51. 25. 0
  libavcodec   53. 34. 0 / 53. 34. 0
  libavformat  53. 20. 0 / 53. 20. 0
  libavdevice  53.  4. 0 / 53.  4. 0
  libavfilter   2. 48. 1 /  2. 48. 1
  libswscale    2.  1. 0 /  2.  1. 0
  libpostproc  51.  2. 0 / 51.  2. 0
[libspeex @ 0x1e36b20] Missing Speex header, assuming defaults.
Input #0, flv, from 'audioStream_1321399534128_21.flv':
  Metadata:
    novideocodec    : 0
    server          : Red5 Server 1.0.0 RC2 Rev: 4295
    creationdate    : Tue Nov 15 15:25:41 PST 2011
    canSeekToEnd    : true
  Duration: 00:00:06.77, start: 0.000000, bitrate: 43 kb/s
    Stream #0:0: Audio: speex, 16000 Hz, 1 channels, s16
Invalid duration specification for t: wav
sox FAIL formats: can't open input pipe `|ffmpeg -i audioStream_1321399534128_21.flv -ar 44100 -ac 2 -t wav pipe:1': premature EOF

Я думаю, что проблема связана с преобразованием из FLV в WAV в FFmpeg, и, поскольку он передается по каналу, это приводит к сбою всего процесса. Я всегда получаю это предупреждение о продолжительности, но когда FFmpeg выводит в файл .wav и команда SoX запускается отдельно, я все равно могу получить WAV из SoX и преобразовать его в MP3 вручную. Я хотел бы сделать все это в одну строку, передавая данные между приложениями.

Что мне делать?

1 Ответ

0 голосов
/ 07 сентября 2012

Проблема здесь:

sox FAIL formats: can't open input pipe

Полагаю, вы хотите, чтобы sox считывал данные из канала, нормализовал и преобразовывал в wav. В этом случае аргумент mix является избыточным. Нечто подобное может сделать:

sox -p -t wav - gain -n | ...
...