Utilitário scriptable para converter BMPS + WAV em vídeo (xvid)?
-
19-09-2019 - |
Pergunta
Estou procurando um utilitário scriptable para converter um monte de BMPs e um arquivo WAV em um vídeo. XVID precisa ser o formato de saída. Eu gostaria que funcionasse no Linux (Ubuntu), se possível. Um utilitário de linha de comando seria ótimo, pois tenho 36 vídeos para criar dessa maneira. UMA bash
(ou [Insira a linguagem de script favorita aqui]) Script seria ótimo para isso. (Também preciso brincar com diferentes dimensões de vídeo, mas posso usar outros programas para redimensionar.)
Eu brinquei com o VirtualDub (para o Windows XP), mas ele não parece atender a essas necessidades. Eu poderia estar errado, no entanto. Quaisquer indicadores para exemplos seriam ótimos.
Eu também estou brincando com ffmpeg
. Parece se encaixar perfeitamente na conta, mas não consigo fazer com que ela junte os BMPs em um vídeo. Aqui está o que estou tentando:
for directory in $BMP_DIRECTORY_PATH/*
do
ffmpeg \
-f image2 \
-i "$directory/Sequence %d%d%d%d%d%d.bmp" \
-r 29.97 \
-vcodec mpeg4 \
-vtag xvid \
\
-i "$file/audio.wav" \
-acodec libmp3lame \
\
$(basename $directory.avi)
done
E aqui está o que está dizendo de volta:
[...]
FFmpeg version 0.5-svn17737+3:0.svn20090303-1ubuntu6, Copyright (c) 2000-2009 Fabrice Bellard, et al.
configuration: --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --extra-version=svn17737+3:0.svn20090303-1ubuntu6 --prefix=/usr --enable-avfilter --enable-avfilter-lavf --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --disable-stripping --disable-vhook --enable-libdc1394 --disable-armv5te --disable-armv6 --disable-armv6t2 --disable-armvfp --disable-neon --disable-altivec --disable-vis --enable-shared --disable-static
libavutil 49.15. 0 / 49.15. 0
libavcodec 52.20. 0 / 52.20. 0
libavformat 52.31. 0 / 52.31. 0
libavdevice 52. 1. 0 / 52. 1. 0
libavfilter 0. 4. 0 / 0. 4. 0
libswscale 0. 7. 1 / 0. 7. 1
libpostproc 51. 2. 0 / 51. 2. 0
built on Apr 10 2009 23:18:41, gcc: 4.3.3
[image2 @ 0x97e5ac0]Could not find codec parameters (Video: bmp)
/home/ben/Pending/1080p_export/6/Sequence %d%d%d%d%d%d.bmp: could not find codec parameters
Eu vi um Postagem da lista de correspondência Sobre isso, mas o que é sugerido não parece funcionar aqui.
ATUALIZAR
Aqui está o script atualizado com várias etapas:
#!/usr/bin/env bash
# bmp+wav2xvid+mp3
#
# Although it has a cryptic name, it's pretty descriptive. This script consumes BMPs (Windows bitmaps) and WAVs (Microsoft AD-PCM Waveforms) to make an XviD (MPEG-4 video) movie.
#
# By convention, you pass it a directory with one or more directories that contain:
#
# * Frames named "frame_001.bmp", "frame_002.bmp", etc.
# * Audio named "audio.wav"
#
# Author: Benjamin Oakes
# FIXME: The audio doesn't get muxed correctly. The A/V sync is off a little. At the beginning it looks pretty okay, but by the end the mouths definitely don't match up with the words that are said.
#############################################################
# NOTE: SEE `ffmpeg -formats` for a list of available formats
#############################################################
# BMP_DIRECTORY_PATH="/home/ben/Outbox/ffmpeg.fixture/"
BMP_DIRECTORY_PATH="/media/Archival Data/Video Projects Backup/Video Projects/1080p_export_dual_gray/"
# Output settings
VTAG="xvid"
VCODEC="mpeg4"
ACODEC="libmp3lame"
DIMENSIONS="1000x562"
FPS="35"
CONTAINER="avi"
if [ -d "$BMP_DIRECTORY_PATH" ]; then
echo "BMP directory exists"
# for directory in "$BMP_DIRECTORY_PATH"/*
# do
directory="/media/Archival Data/Video Projects Backup/Video Projects/1080p_export_dual_gray/1"
ffmpeg \
-f image2 \
-i "$directory/frame_%03d.bmp" \
-vcodec mpeg1video \
-sameq \
\
-r $FPS \
"../tmp/$(basename "$directory.mpg")"
ffmpeg \
-i "../tmp/$(basename "$directory.mpg")" \
-vcodec $VCODEC \
-vtag $VTAG \
-s $DIMENSIONS \
-sameq \
\
-i "$directory/audio.wav" \
-acodec $ACODEC \
-ar 8000 \
\
-f $CONTAINER \
-r $FPS \
"../tmp/$(basename "$directory")-$VTAG-$VCODEC-$ACODEC-$DIMENSIONS-$FPS.$CONTAINER"
# done
else
echo "ERROR: BMP directory does not exist"
fi
Atualização 2
Por favor, veja minha resposta para o que acabei começando a trabalhar.
Solução 2
This is what I ended up with, just for other people's reference.
# bmp+wav2xvid+mp3
#
# Although it has a cryptic name, it's pretty descriptive. This script consumes BMPs and WAVs to make an XviD (MPEG-4 video) movie.
#
# By convention, you pass it a directory with one or more directories that contain:
#
# * Frames named "frame_001.bmp", "frame_002.bmp", etc.
# * Audio named "audio.wav"
#
# Author: Benjamin Oakes
# Output settings
VTAG="xvid"
VCODEC="mpeg4"
ACODEC="libmp3lame"
ABITRATE="128k"
QSCALE="1"
DIMENSIONS="1000x562"
FPS="24000/1001"
CONTAINER="avi"
if [ -d "$BMP_DIRECTORY_PATH" ]; then
echo "BMP directory exists"
for directory in "$BMP_DIRECTORY_PATH"
do
ffmpeg \
-f image2 \
-r 24000/1001 \
-i "$directory/frame_%03d.bmp" \
\
\
-i "$directory/audio.wav" \
\
\
-vcodec $VCODEC \
-vtag $VTAG \
-qscale $QSCALE \
-s $DIMENSIONS \
-r $FPS \
\
-acodec $ACODEC \
-ab $ABITRATE \
\
"../tmp/$(basename "$directory").avi"
done
else
echo "ERROR: BMP directory does not exist"
fi
Outras dicas
I think you are trying to do too much at once. Try breaking the task up into three discrete actions:
- create video from bmp images
- mux in the audio
- encode to target format
To that end, I would suggest using mpeg1 as your intermediate video format.