ffmpeg -ss 0.04 -i source.mp4 -c:v copy output.mp4
Тут 0.04 секунды это длительность 1 кадра при 25 fps = 1/25 секунды.-c:v libx264 -pix_fmt yuv420p -preset medium -r 25 -g 50 -b:v 2500k
ffmpeg -i input1.mp4 \
-c:v libx264 \
-pix_fmt yuv420p \
-preset medium \
-r 25 -g 50 \
-b:v 2500k \
-bsf:v h264_mp4toannexb -f mpegts \
video.ts
# this is a comment
file '/mp3/day1/file1.mp3'
file '/mp3/day1/file2.mp3'
file '/mp3/day1/file3.mp3'
ffmpeg \
-loop 1 -f mpegts -i video.ts \
-f concat -safe 0 -i playlist.txt \
-c:a aac -b:a 128k \
-c:v copy \
-f flv \
rtmp://a.rtmp.youtube.com/live2/ВАШ_КЛЮЧ
Не проверял, и скорее всего предстоит много работы по проверке и отладке параметров. ffmpeg -i left.avi -i right.avi -filter_complex "
nullsrc=size=200x100 [background];
[0:v] setpts=PTS-STARTPTS, scale=100x100 [left];
[1:v] setpts=PTS-STARTPTS, scale=100x100 [right];
[background][left] overlay=shortest=1 [background+left];
[background+left][right] overlay=shortest=1:x=100 [left+right]
" output.mp4
ffmpeg \
-i fon.jpg \
-i vertvideo.mp4 \
-filter_complex " \
[0:v] setpts=PTS-STARTPTS, scale=1280x720 [fon]; \
[1:v] setpts=PTS-STARTPTS, scale=-2x720 [video]; \
[fon][video] overlay=x=(W-w)/2 \
" \
-y -hide_banner \
result.mp4
ffmpeg \
-i "c:/ffmpeg/videos/video_1.avi" \
-t 10 \
-c:v copy \
-c:a copy \
"c:/ffmpeg/videos2/video_1.avi"
ffmpeg \
-i input.mp4 \
-lavfi '[0:v] scale=ih*16/9:-1, boxblur=luma_radius=min(h\,w)/20:luma_power=1:chroma_radius=min(cw\,ch)/20:chroma_power=1[bg]; [bg][0:v]overlay=(W-w)/2:(H-h)/2, crop=h=iw*9/16' \
-vb 800K \
output.webm
local MUSIC_LENGTH=$(ffprobe \
-v quiet \
-print_format ini \
-show_format \
"$MUSIC_PCM" | grep duration | sed s/duration=//)
$MUSIC_PCM
– путь к медиафайлу. fps=1/16
берет 1 кадр из 16 секунд.fps
, чтобы получилось 80 кадров: fps=80/длина_видео_в_секундах
thumbnail
– он выбирает наиболее значимый кадр и серии кадров. Работает чуть медленнее и требует больше памяти, но выбранные кадры получаются лучше - без размытого движения и т.п. Тут тоже нужно знать длину видео и частоту кадров, т.е. общее число кадров в видео. И разделить его на 80. Например, видео длиной 15 минут с частотой кадров 30 даёт 30 * 15 * 60 = 27000 кадров. Разделить на 80 получится 337.5 кадров. Т.е. нужно бы использовать вместо fps=..
фильтр thumbnail=338
.bat
или .sh
, в зависимости от платформы. FILTER="[0] \
pad=color=0x99999900:w=${wIn}:h=${hIn}:x=${xPad}:y=${yPad}, \
scale=20064x3264, \
zoompan= \
s=${wSrc}x${hSrc} \
:d=${frames} \
:z='( ${zoomcode} ) / 16.89999' \
:x='2*(${xPad} + ${xPoi}) * (zoom - 1) / zoom' \
:y='2*(${yPad} + ${yPoi}) * (zoom - 1) / zoom' \
[fg]; \
[1][fg]overlay=x=247:y=438 \
"
ffmpeg -i audio.mp3 -i video.webm -c:v libx264 -c:a aac result.mp4
-i audio.mp3
указывает один из входов, файл со звуком;-i video.webm
ещё один вход, файл с видео;-c:v libx264
указывает видео кодек, которым жать видео дорожку;-c:a aac
аудио кодек, которым жать аудио.result.mp4
– куда сохранить результат. aom
/ av1
, который упорно показывал свою версию как 0.1.0
, а не требуемую 1.0.0
. Создал тикет. Эта мелочь вылечилась отказом от кодека aom - в 376-й строке скрипта build-ffmpeg
заменил --enable-libaom
на --disable-libaom
let WIDTH=640
let HEIGHT=480
let MID=$WIDTH/2
let BUFFER=16
let FRAMERATE=30
let XRATE=$BUFFER\*$FRAMERATE
let DURATION=8
let FPERIOD=$XRATE\*$DURATION
ffmpeg \
-filter_complex \
" \
color=white:${WIDTH}x${HEIGHT}:d=$DURATION:r=$XRATE,format=rgb24[bg]; \
color=black:8x${HEIGHT}:d=$DURATION:r=$XRATE,format=rgb24[bar]; \
[bg][bar]overlay=x='$MID + $MID * sin(8 * PI * n / $FPERIOD)':y=0:format=yuv444,format=yuv420p[motion]; \
[motion]tmix=frames=$BUFFER \
" \
-c:v libx264 \
-r $FRAMERATE \
-an \
-hide_banner \
-y \
output.mp4
ffmpeg \
-i video.mp4 \
-filter_complex "amovie=audio.mp3:loop=0,asetpts=N/SR/TB[over]; [0][over]amix=duration=shortest" \
-c:v copy \
result.mp4
ffmpeg \
-i video.mp4 \
-i newAudio.mp3 \
-c:v copy \
-c:a aac \
-map 0:v:0 \
-map 1:a:0 \
result.mp4
-c:a pcm_s16le -f s16le -ar 48000 -ac 2 ... audio.pcm
, видео в ts: -c:v libx264 -bsf:v h264_mp4toannexb -f mpegts ... video.ts
-i "concat:video1.ts|video2.ts"
.ts
формат, который потом можно просто склеивать.# из mp4 сделать ts
TMPVIDEO="tmp_video.ts"
ffmpeg \
-i "short.mp4" \
-bsf:v h264_mp4toannexb \
-an \
-f mpegts \
-y -hide_banner \
"$TMPVIDEO"
# до этого определить, сколько раз повторить фрагмент,
# чтобы покрыть длину mp3
REPEATS=5
LONGVIDEO="long_video.ts"
N=1
while [ $N -le $REPEATS ]; do
ffmpeg -i "concat:$TMPVIDEO|$TMPVIDEO" \
-c:v copy \
-y -hide_banner \
"$LONGVIDEO"
local STATUS=$? ; if [ $STATUS -ne 0 ]; then return $STATUS; fi
rm -f "$TMPVIDEO"
mv "$LONGVIDEO" "$TMPVIDEO"
local N=$[$N << 1]
echo "N: $N"
done
# получили длинное видео с запасом
# подрезать длину, чтобы точно соответствовала
FFMPEG -i "$TMPVIDEO" \
-c:v copy \
-t $MUSIC_LENGTH \
-y -hide_banner \
"$LONGVIDEO"