Vídeo Concat, adicione lacunas negras entre

2

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 eu mudei o 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] Media type mismatch between the 'Parsed_trim_0' filter output pad 0 (video) and the 'Parsed_concat_2' filter input pad 1 (audio)

[AVFilterGraph @ 0x4447600] Cannot create the link trim:0 -> concat:1

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

    
por frutality 13.03.2017 / 11:30

2 respostas

0

Você também terá que adicionar e aparar os segmentos de áudio, além de adicionar o áudio dos vídeos de origem, por exemplo

Adicione -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

    
por 13.03.2017 / 11:47
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ê, certifique-se de que channel_layout, sample_rate, taxa de quadros e outros atributos sejam idênticos para todos os vídeos, incluindo o silence.mp4. Audio e Video codec hell é um incêndio em aterros de ofuscação e abuso de pessoas tentando eliminar concorrentes do espaço de vídeo.

    
por 09.11.2017 / 02:36