Concatenando com sucesso vários vídeos

5

Minha missão é criar vídeos com apresentações de slides antigas da web. Para começar, tenho jpegs e arquivos de áudio que funcionavam como slideshows Flash em um sistema antigo, estruturado como este:

Estrutura de áudio

  • my_audio_1.mp3 (este arquivo é um mp3 de 3 segundos de silêncio)
  • my_audio_2.mp3
  • my_audio_3.mp3
  • my_audio_4 etc ... aproximadamente 30 mp3s por apresentação de slides

Estrutura da imagem

  • my_image_1.jpg (isso funciona como o slide de abertura)
  • my_image_2.jpg
  • my_image_3.jpg
  • minha_imagem_4. etc ... cerca de 30 imagens por apresentação de slides .

Como existem quase 100 slideshows que devem ser convertidos em vídeo, criei uma interface baseada na web usando PHP para automatizar o processo, que fica em um sistema local e tenta combinar os arquivos usando shell_exec () . O processo usa o seguinte fluxo de trabalho:

  1. Faça um loop em cada slide e crie um avi ou mpeg. Assim, por exemplo, my_mini_video_2.avi seria um vídeo que consiste em my_image_2.jpg e tem uma trilha sonora de my_audio_2.mp3 . Este slide duraria o comprimento de my_audio_2.mp3 .
  2. Juntar / unir / concatir todos os mini-vídeos para criar o vídeo final (usando uma combinação de gato e mencoder ou ffmpeg (Eu também tentei avimerge mas sem sucesso).
  3. Transcodifique o novo vídeo "mestre" para vários formatos, como flv, etc.

Eu achei que isso seria simples e esteve próximo em muitas ocasiões, mas ainda não funcionará. Eu não posso passar do estágio 2 porque não consigo um vídeo perfeito 'master'. Eu já experimentei Mencoder, FFMpeg e parece ter passado por todas as combinações em que consigo pensar. O problema é que o áudio e o visual nunca são sincronizados, não importa o que eu tente.

Além disso, eu até tentei criar mini-vídeos sem áudio, unindo os MP3s em um longo MP3 usando cat e mp3wrap e então atribuindo o novo MP3 longo como a faixa de áudio, mas isso sempre produz um arquivo muito curto ou um arquivo muito lento e faz a dublagem feminina soar como um pugilista masculino!

Parece não haver problemas com os arquivos originais.

Alguém tem alguma experiência em produzir um vídeo com sucesso do mesmo tipo de ponto de partida? Ou alguma ideia sobre o que eu posso estar fazendo errado?

Como exemplo:

Se eu criar mini-vídeos silenciosos, e juntá-los em 'temp-master.mpg' e depois juntar os MP3 juntos em um único MP3 chamado 'temp-master-audio.mp3', a duração do arquivo de áudio é 09: 10 e a duração do arquivo de vídeo é 08:35. Eles devem ser o mesmo e o áudio parecerá muito ruim.

Eu não postei código, já que escrevi muitas e muitas combinações.

ATUALIZADO em 21 de março de 2010

Graças à recomendação de Michael Steele sobre o AviSynth e o VirtualDub (e eu adicionei o plugin GScript), eu consegui fazer algum progresso, e este script está quase funcionando. O único problema agora é que, embora neste exemplo 4 mini-vídeos estejam sendo adicionados um ao lado do outro como eu quero, o mini-vídeo é sempre o mesmo (por exemplo, video-4, video-4, video-4 , video-4 em vez de video-1, video-2, video-3, video-4 ):

# A nearly functional AVS file    

# Set out some basic variables
base_audio = "C:\..."
base_image = "C:\..."
total_slides = 4

LoopThroughFiles(total_slides, base_audio, base_image)

#This is the function for outputting each combination
function AudioNImage(string mp3, string image, float fps)
{
    audio = DirectShowSource(mp3)
    length = audiolengthF(audio)
    rate = Audiorate(audio)
    frames = Int((length/rate)*fps)
    video = ImageSource(image, end=Int(frames), fps=fps)
    return audiodub(video, audio)
}

#Loop through the files to create the full command string
# My audio and image files are in the format of VID0002.jpg and VID0002.mp3
function LoopThroughFiles(int total, string audiopath, string imagepath)
{
    GScript("""
        cmd = ""
        for (i=1, total) {
            audio = audiopath + "000" + String(i) + ".mp3"
            picture = imagepath + "000" + String(i) + ".jpg"
            cmd = cmd + "AudioNImage(audio, picture, 25)"
            if (i < total) {
                cmd = cmd + "+" 
            }
        }
        GEval(cmd)
    """)
}

Então, isso está quase aí, mas eu só preciso descobrir por que os mini-vídeos não são incrementados?

    
por Sathya 19.03.2010 / 14:13

1 resposta

1

Seu problema pode ser causado por diferentes taxas de quadros no conteúdo de origem. Use um aplicativo como o MediaInfo para determinar se esse é o problema.

Sugestão 1

Eu tive sucesso usando o AviSynth e o VirtualDub para tarefas como essa. Avisynth cria um fluxo de vídeo baseado em um script escrito por você. É perfeito para combinar vários arquivos pequenos, porque você é capaz de definir horários precisos. Você pode ter que usar um dos muitos plugins de terceiros para exibir imagens .jpg sucessivas por períodos definidos de tempo.

Uma vez que você esteja feliz com o que o AviSynth está produzindo, use o VirtualDub para codificá-lo em qualquer formato que você quiser.

Sugestão # 2

Faça o seu áudio e vídeo separadamente, e depois mescle os dois fluxos como um passo final.

  1. Use um editor de áudio como o Audacity para criar um mestre .mp3 ou .wav descompactado.
  2. Crie seu vídeo de apresentação de slides como você está fazendo.
  3. Combine os dois fluxos. O VirtualDub pode fazer isso, mas é um pouco complicado para algo tão simples. Eu usei ripbot264. A popular ferramenta Handbrake também poderia provavelmente fazer isso.
por 19.03.2010 / 22:32