Автор Тема: Использование FFMpeg и Sox - для создания скринкастов  (Прочитано 4769 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн sunset

  • Постоялец
  • ***
  • Автор темы
  • Сообщений: 106
 Тут была тема - "Кто использует gtk-recordMyDesktop ?"

Предлагаю альтернативный вариант создания скринкастов:

screen-cast.sh
#!/bin/bash

# .Color messages
black='\E[30;40m\033[1m'
red='\E[31;40m\033[1m'
green='\E[32;40m\033[1m'
yellow='\E[33;40m\033[1m'
blue='\E[34;40m\033[1m'
magenta='\E[35;40m\033[1m'
cyan='\E[36;40m\033[1m'
white='\E[37;40m\033[1m'


cecho ()                     # Color-echo.
                             #  $1 = message
                             #  $2 = color
{
local default_msg=""

message=${1:-$default_msg}   # default message
color=${2:-$yellow}           # default color.

  echo -e "$color" "$message" "\033[0m"
  tput sgr0                  # Восстановление первоначальных настроек терминала.
  return
}

#-----------------------------------------------------------------------------------------------------
# If you are capturing audio using ffmpeg – often the “ALSA buffer xrun”.
# After this desync audio and video.
# To avoid this, you need to capture sound with sox, and video using ffmpeg. Then perform merge files.
#-----------------------------------------------------------------------------------------------------

# USEcodec = mpeg4 xvid ffv1  mkv mov
USEcodec=$1
baseName=$2
screenIN=$3
screenOUT=$4

# Audio - oss , alsa
Audio="alsa"
# ADevice - pulse , default , hw:0 , hw:0.0 (for Alsa)
# ADevice - /dev/dsp (for OSS)
ADevice="default"

# Tests if the base name was specified. If not, take default value
if [ "$baseName" = "" ]; then
baseName="screencast"
fi

# Tests if the screenIN and screenOUT was specified. If not, take default value
if [ "$screenIN" = "" ]; then
screenIN="1024x768"
screenOUT="1024x768"
else
    if [ "$screenOUT" = "" ]; then
        screenOUT="$screenIN"
  fi
fi

# Tests if the codec was specified. If not, echo message and stop
if [ "$USEcodec" = "mkv" ]; then
Setting="libx264 -vpre lossless_ultrafast -g 150 -threads 0"
ext=".mkv"
   else
    if [ "$USEcodec" = "mov" ]; then
   Setting="qtrle -g 150"
   ext=".mov"
   else
    if [ "$USEcodec" = "mpeg4" ]; then
   Setting="mpeg4 -b 4000k -g 150"
   ext=".avi"
   else
    if [ "$USEcodec" = "xvid" ]; then
   Setting="mpeg4 -vtag xvid -b 4000k -g 150"
   ext=".avi"
   else
    if [ "$USEcodec" = "ffv1" ]; then
   Setting="ffv1 -b 4000k -g 150  -sameq"
   ext=".avi"
 else
cecho ""
cecho "========================================================="
cecho " Usage:"
cecho " sh scc.sh codec [FileName] [screenIN] [screenOUT]"
cecho "           codec = ffv1,mpeg4,mkv,mov,xvid"
cecho "========================================================="
cecho " Example: sh scc.sh mpeg4"
cecho " Example: sh scc.sh ffv1 namescreencast"
cecho " Example: sh scc.sh xvid namescreencast 1024x768"
cecho " Example: sh scc.sh mov namescreencast 1024x768 1440x1080"
cecho "========================================================="
exit
    fi
   fi
  fi
 fi
fi

rm "$baseName-nosound$ext" &>/dev/null
rm "$baseName-final$ext" &>/dev/null
rm "$baseName.wav" &>/dev/null
rm "$baseName.mp4" &>/dev/null

cecho ""
cecho ""
cecho "**************************************"
cecho "* Using  Enter  to finish recording  *"
cecho "*                                    *"
cecho "* Using  Enter  to finish recording  *"
cecho "*                                    *"
cecho "* Using  Enter  to finish recording. *"
cecho "*                                    *"
cecho "**************************************"
# Waits for the user to press Enter.
cecho ""
cecho ".....Press ENTER to start recording." $green
read nothing

sox --ignore-length --buffer 1024000 -t $Audio $ADevice -t wav "$baseName.wav" | ffmpeg -isync -f x11grab -s "$screenIN" -r 25 -i :0.0 -vcodec $Setting "$baseName-nosound$ext" &
pidV=$(ps -ef | grep "[f]fmpeg" | awk '{print $2}') pidA=$(ps -ef | grep "[s]ox" | awk '{print $2}')

cecho ""
cecho "Audio recording started with process ID $pidA" $cyan
cecho "Video recording started with process ID $pidV" $cyan
read nothing
# Waits for the user to press Enter.

kill -15 $pidA $pidV

cecho ""
cecho "Kill Audio process with ID $pidA" $blue
cecho "Kill Video process with ID $pidV" $blue
cecho ""

ffmpeg -isync -i "$baseName.wav" -i "$baseName-nosound$ext" -acodec copy -vcodec copy "$baseName-final$ext"

rm "$baseName.wav" &>/dev/null
rm "$baseName-nosound$ext" &>/dev/null

cecho ""
cecho "====================================================================="
cecho ""
cecho ".....Press ENTER to start encoding, or <CTRL-C> - to encoding manualy"
cecho "====================================================================="
read nothing

cecho "**********************************" $cyan
cecho "*                                *" $cyan
cecho "*  Wait -  encoding output file  *" $cyan
cecho "*                                *" $cyan
cecho "*  Wait -  encoding output file  *" $cyan
cecho "*                                *" $cyan
cecho "*  Wait -  encoding output file. *" $cyan
cecho "*                                *" $cyan
cecho "**********************************" $cyan

ffmpeg -i "$baseName-final$ext" -acodec libfaac -ab 192k -ac 2 -vcodec libx264 -s "$screenOUT" -vpre slow -crf 20 -threads 0 $baseName.mp4
rm "$baseName-final$ext" &>/dev/null

cecho ""
cecho "====================================================================="
cecho ".....DONE!  video file $baseName.mp4 were written to the folder....."
cecho "====================================================================="
# end

В отличие от  gtk-recordMyDesktop, ffmpeg и sox - гораздо меньше нагружают систему
при записи скринкастов. А также появляется возможность использования различных кодеков,
и запись в HD формате, который позволяет сохранить качество -  при выкладывании ролика на youtube.

При запуске скрипта без параметров - выдаётся пример использования (параметров)
Конец записи осуществляется нажатием клавиши <ENTER>

ffmpeg - захватывает видео
sox -  захватывает
Потом происходит совмещение записанных файлов
« Последнее редактирование: Февраль 17, 2013, 13:31:06 от Пользователь. »