Concat video, adicione lacunas negras entre

2

Eu estou tentando concatenar vários arquivos de mídia. Cada arquivo contém vídeo e áudio. Eu preciso adicionar quadros silenciosos de tela preta após cada mediafile (exceto o último).

Quero dizer file + gap + file + gap + file.

eu encontrei resposta muito útil aqui, mas funciona apenas para áudio.

Então mudei de comando. Funciona também, mas sem som. Aqui está o comando:

ffmpeg -i video-1489396334138.webm -i video-1-1489396340932.webm -i video-1489396346168.webm -f lavfi -i "color=c=black:s=640x480:r=25" \ -filter_complex " [3]trim=duration=3.932[g0];[3]trim=duration=3.168[g1]; [0][g0][1][g1][2]concat=n=5:v=1:a=0" output.webm

Eu sei que é por causa de a=0. Mas quando eu mudo para a=1, o ffmpeg lança um erro:

[Parsed_trim_0 @ 0x4448080] Incompatibilidade de tipo de mídia entre o bloco de saída do filtro 'Parsed_trim_0' 0 (vídeo) e o bloco de entrada do filtro 'Parsed_concat_2' 1 (áudio)

[AVFilterGraph @ 0x4447600] Não é possível criar o trim do link: 0 - & gt; concat: 1

Provavelmente é porque o nosso lavfi entrada não contém nenhum áudio. Então, a questão é, como consertar isso?

frutality
fonte

Respostas:

0

Você também precisará adicionar e aparar os segmentos de áudio, além de adicionar o áudio dos vídeos de origem, ou seja,

Adicionar -f lavfi -i anullsrc às entradas.

Apare estes

[4]atrim=duration=3.932[a0];[4]atrim=duration=3.168[a1];

E adicione todo o áudio ao filtro de concat.

[0:v][0:a][g0][a0][1:v][1:a][g1][a1][2:v][2:a]concat=n=5:v=1:a=1

Gyan
fonte
Isso é brilhante. Funciona como um encanto.
frutality
0

Como concatenar vídeos com um intervalo de silêncio de 4 segundos entre cada um sobreposto por uma imagem pic.jpg:

#Create a silence.mp4 file with audio silence over any given image: 
#note this is all one line with the backslashes removed.
ffmpeg -loop 1 -i /home/youruser/pic.jpg -f lavfi \
    -i anullsrc=channel_layout=5.1:sample_rate=48000 -t 4 \
    -c:v libx264 -t 4 -pix_fmt yuv420p -vf scale=480:320 -y silence.mp4

#transform silence.mp4 to silence.ts so that its type is 
#fluid and conforms to the original
ffmpeg -i silence.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts silence.ts

#loop over all the mp4 files numerically making sure '10' doesn't come before '2'
for f in $(ls ./*.mp4 | sort -V)
do
    #Transform all the given mp4 files to ts files.
    ffmpeg -i $f -c copy -bsf:v h264_mp4toannexb -f mpegts $f.ts
    if [ $counter -eq 0 ]; then
        all_transport_files="$(basename $f.ts)"
    else 
        #inject the silence in between the previous and next
        all_transport_files="$all_transport_files|silence.ts|$(basename $f.ts)"
    fi
    #keep track of which one we're on, first is not like the others
    ((counter++))
    echo $counter
done

#final concate string with all videos in order, with silence between
concat_and_all_files="concat:$all_transport_files"

#Join all the ts files back together into output.mp4
ffmpeg -async 1 -i "$concat_and_all_files" -c copy -bsf:a aac_adtstoasc output.mp4

Voila, todos os seus arquivos de vídeo separados por algum silêncio. Se isso não funcionar para você, verifique se channel_layout, sample_rate, frame rate e outros atributos são idênticos para todos os vídeos, incluindo o silence.mp4. Audio e Video codec hell é um incêndio de aterro de ofuscação e abuso de pessoas tentando eliminar concorrentes do espaço de vídeo.

Eric Leschinski
fonte