Wie kann ich mehrere Audiodateien mit Zeitleistenversatz in eine Videodatei einbetten?

Wie kann ich mehrere Audiodateien mit Zeitleistenversatz in eine Videodatei einbetten?

Ich habe eine Videodatei:

screencast.mpg (100sec)

Und mehrere Audiodateien (Dateiname gibt den Offset an):

10.wav (10sec)
30.wav (5sec)
45.wav (8sec)

Wie kann ich diese Dateien zusammenführen:

V:||||||||||||||||||||||||||||||||||||||||||||||||||
A:    .....     ...     ....

Ich möchte ein Skript schreiben, das diese Aufgabe automatisch erledigt.
Ich habe ffmpeg -itsoffsetdie Option ausprobiert, aber es ist fehlgeschlagen.

Antwort1

Der folgende Code geht davon aus, dass Ihre .wavDateien 4800 Hzund sind stereo.
Er erstellt Segmente der Stille, basierend auf den obigen Werten.
Er erzeugt ein einzelnes .wav., das mit dem Video gemultiplext werden kann.

nrChannels=2
sampleRate=48000

rawSilence() {
  local nrSeconds=$1
  local sampleRate=$2
  local nrChannels=${3:-2}
  ffmpeg -acodec pcm_s16le \
         -ar $sampleRate \
         -ac $nrChannels \
         -f s16le \
         -i <(dd if=/dev/zero bs=$((sampleRate*2*nrChannels)) count=$nrSeconds) \
         -f s16le -
}

{ 
  rawSilence 10 $sampleRate $nrChannels 
  cat "10.wav" |ffmpeg -f wav -i - -f s16le -
  rawSilence 10 $sampleRate $nrChannels
  cat "30.wav" |ffmpeg -f wav -i - -f s16le -
  rawSilence 10 $sampleRate $nrChannels
  cat "45.wav" |ffmpeg -f wav -i - -f s16le -
  rawSilence 47 $sampleRate $nrChannels
} |
  ffmpeg -acodec pcm_s16le \
         -ar $sampleRate \
         -ac $nrChannels \
         -f s16le \
         -i - \
         -f wav -y 100sec.wav

Um Video und Audio zusammen zu multiplexen, sollte diese oder eine andere Kodierungsvariante ausreichen:

ffmpeg -i "100sec.mpg" \
       -i "100sec.wav" \
          -vcodec copy \
 -y "100sec.muxed.mpg"

verwandte Informationen