Как записать видеовызовы Skype на Linux?

Если Вы находитесь в основанной на Red Hat системе, как Вы упомянули, можно сделать следующее:

  1. Создайте сценарий и место в /etc/init.d (например, /etc/init.d/myscript). Сценарий должен иметь следующий формат:
#!/bin/bash
# chkconfig: 2345 20 80
# description: Description comes here....

# Source function library.
. /etc/init.d/functions

start() {
    # code to start app comes here 
    # example: daemon program_name &
}

stop() {
    # code to stop app comes here 
    # example: killproc program_name
}

case "$1" in 
    start)
       start
       ;;
    stop)
       stop
       ;;
    restart)
       stop
       start
       ;;
    status)
       # code to check status of app comes here 
       # example: status program_name
       ;;
    *)
       echo "Usage: $0 {start|stop|status|restart}"
esac

exit 0 

Формат довольно стандартен, и можно просмотреть существующие сценарии в /etc/init.d. Можно затем использовать сценарий как так /etc/init.d/myscript start или chkconfig myscript start. ckconfig страница справочника объясняет заголовок сценария:

 > This says that the script should be started in levels 2,  3,  4, and
 > 5, that its start priority should be 20, and that its stop priority
 > should be 80.

Пример запускается, останавливается, и код состояния использует функции, определяемые помощника в /etc/init.d/functions

  1. Включите сценарий

    $ chkconfig --add myscript 
    $ chkconfig --level 2345 myscript on 
    
  2. Проверьте, что сценарий действительно включен - необходимо видеть "на" для уровней, которые Вы выбрали.

    $ chkconfig --list | grep myscript
    
28
21.04.2011, 00:00
5 ответов

Существует программное обеспечение recordMyDesktop http://recordmydesktop.sourceforge.net/about.php, которое можно записать любую часть Вас экран, который Вы хотите. Я использую его для записи моих сессий в скайпе.

sudo apt-get install recordmydesktop

устанавливать его от основных каналов.

11
27.01.2020, 19:39
  • 1
    я использовал это при износе гарнитуры и она записала бы аудио другой стороны. Я предполагаю, что это записывало аудио от микрофона по умолчанию (таким образом, это получало мою собственную речь, но не другая сторона). Какая-либо идея, как зафиксировать это? –  Marcus Junius Brutus 29.01.2017, 02:46

Эта команда получит Ваш полный рабочий стол: Так используйте эту команду, каждый раз, когда Вы хотите записать разговор в скайпе (или что-либо еще)

ffmpeg -f x11grab -s wxga -r 25 -i :0.0 -sameq /tmp/out.mpg   
11
27.01.2020, 19:39
  • 1
    Спасибо!, Как я могу записать только определенные окна, например, окно моей веб-камеры и окно другого человека? Возможно, даже, как записать их отдельно, чтобы помочь отредактировать. –  curiousguy 23.04.2011, 14:03
  • 2
    @curiousguy, для записи определенного окна с recordmydesktop, использует "xwininfo" для получения идентификатора окна, затем с использованием recordmydesktop "-windowid" параметр. Если Вы хотите масштабировать свое окно к определенному размеру (в пикселях) существуют различные способы сделать это - я полагаю, что Compiz имеет это как опцию, также Openbox скажет Вам размеры окна. (Я использую Fedora.) Также я полагаю, что Openbox позволит Вам "не украсить" окно, которое полезно, если recordmydesktop записывает Вашу границу окна. Однако я не уверен, возможно ли это с ffmpeg? –  PJ Brunet 10.06.2011, 03:20
  • 3
    Как можно было бы скомпилировать с x11grab, включенным под человечностью? В каком пакете это нуждается? –  v010dya 22.01.2014, 15:14

xvidcap позволяет выбрать область на рабочем столе и записать ее. Запустите его командой

-p      Requests changing the passphrase of a private key file instead of
        creating a new private key.  The program will prompt for the file
        containing the private key, for the old passphrase, and twice for
        the new passphrase.
и найдите ваше видео в ./test-0000.mpeg по умолчанию.

.
0
27.01.2020, 19:39

Background

Запись видео и звука во время разговора (или во время любой активности на рабочем столе X11) не представляет особой сложности благодаря ffmpeg и количеству доступных справочных статей (включая этот сайт). Однако, если вы стремитесь к более высокому качеству, вы быстро достигнете пределов простого подхода одновременного захвата и сжатия медиа. Отсюда возникает необходимость в инструменте (или наборе инструментов), который позволил бы:

  1. Записывать звонки без сжатия в файл для дальнейшей обработки, понимая, что при звонке на телефон нас интересует только звук.
  2. Сжимать записанные звонки в высоком качестве в более позднее время.

Следующие Bash-скрипты (myrec, myrec-novideo и myproc) являются моей попыткой решить эту задачу. Я уверен, что есть более аккуратные способы написания этих сценариев, но я изучал сценарии Bash на ходу (с огромным удовлетворением, когда они заработали, я могу добавить).

Предварительные условия

  1. ffmpeg
  2. pulseaudio
  3. skype

Если 1 или 2 отсутствуют в вашей системе, установите их с помощью предпочитаемого менеджера пакетов (я использую synaptic). Для skype посетите www.skype.com.


Запись видео без потерь и аудио без потерь - myrec

  1. Создайте текстовый файл
  2. Сохраните его как myrec (или любое другое имя, которое вам подходит)
  3. Сделайте myrec исполняемым, выполнив команду: chmod +x myrec
  4. Вставьте в него следующий код и измените раздел Настройки пользователя в соответствии с вашей установкой:

#!/bin/bash

echo "Record lossless audio and lossless video for further processing."
echo "Created file name always starts with temp_YYYYMMDD_HHMMSS."
echo "Syntax:"
echo "myrec [optional file description]"
echo "Optional file description is appended to the file name, with spaces replaced by underscores."
echo
echo

### User settings - adjust values to suit your system and needs

# I used to have the name of my webcam mic here, but that stopped working after a system update. "default" was the only fix I found. If you have more than one microphone connected, you may need to tell Pulseaudio which mic you want to be the default, I think pavucontrol is the utility for it.
# If you want to try supplying a name here, run pacmd, then within it the command list-sources will give you a list of possible microphones. Use the name field value without angle brackets.
microphone_audio_device="default"

# Run pacmd, within it the command list-sinks will give you a list of devices to choose from. Use the name field value without angle brackets.
speakers_audio_device="alsa_output.pci-0000_00_1b.0.analog-stereo.monitor"

# Select frame size.
# Some standard frame sizes for reference:
# wvga 852x480
# wxga 1366x768
# wsxga 1600x1024
# wuxga 1920x1200
# woxga 2560x1600
# wqsxga 3200x2048
# wquxga 3840x2400
# whsxga 6400x4096
# whuxga 7680x4800
frame_size="wsxga"

# Framerate in frames per second
framerate="30"

# Indicate which screen the video should be recorded from and an optional offset.
# For example:
# :0.0+10,20
# where 0.0 is display.screen number of your X11 server, same as the DISPLAY environment variable. 10 is the x-offset and 20 the y-offset of the frame, measured from the top left corner of the screen to the top left corner of the frame.
frame_position=":0.0"

# Include the trailing slash after target directory name.
# Expect a very large file!
target_directory="/target/directory/name/"

### End of user settings



record_command="ffmpeg -f pulse -thread_queue_size 512k -i $speakers_audio_device -f pulse -thread_queue_size 512k -i $microphone_audio_device -f x11grab -s $frame_size -r $framerate -thread_queue_size 512k -i $frame_position -map 0 -map 1 -map 2 -codec:a copy -codec:v libx264 -qp 0 -preset ultrafast"
temporary_file_prefix="temp_"

# The IFS (Internal Field Separator) system variable stores the character that separates command line arguments.
# We can use it to replace spaces with underscores.
temp=$IFS
IFS='_'
description="$*"
IFS=$temp

if [ $# -eq 0 ]; then
  $record_command $target_directory$temporary_file_prefix`date +%Y%m%d_%H%M%S`.mkv
else
  $record_command $target_directory$temporary_file_prefix`date +%Y%m%d_%H%M%S`_$description.mkv
fi

Запись только аудио обрабатывается отдельным скриптом в следующем разделе.


Запись только аудио без потерь - myrec-novideo

  1. Создайте текстовый файл
  2. Сохраните его как myrec-novideo (или любое другое имя, которое вам подходит)
  3. Сделайте myrec-novideo исполняемым, выполнив команду: chmod +x myrec-novideo
  4. Вставьте в него следующий код и измените раздел User settings в соответствии с вашими настройками:

#!/bin/bash

echo "Record lossless audio for further processing."
echo "Created file name always starts with temp_YYYYMMDD_HHMMSS."
echo "Syntax:"
echo "myrec-novideo [optional file description]"
echo "Optional file description is appended to the file name, with spaces replaced by underscores."
echo
echo


### User settings - adjust values to suit your system

# I used to have the name of my webcam mic here, but that stopped working after a system update. "default" was the only fix I found. If you have more than one microphone connected, you may need to tell Pulseaudio which mic you want to be the default, I think pavucontrol is the utility for it.
# If you want to try supplying a name here, run pacmd, then within it the command list-sources will give you a list of possible microphones. Use the name field value without angle brackets.
microphone_audio_device="default"

# Run pacmd, within it the command list-sinks will give you a list of devices to choose from. Use the name field value without angle brackets.
speakers_audio_device="alsa_output.pci-0000_00_1b.0.analog-stereo.monitor"

# Include the trailing slash after target directory name.
# Expect a large file!
target_directory="/target/directory/name/"

### End of user settings



record_command="ffmpeg -f pulse -thread_queue_size 512k -i $speakers_audio_device -f pulse -thread_queue_size 512k -i $microphone_audio_device -map 0 -map 1 -codec:a copy -codec:a copy"
temporary_file_prefix="temp_"

# The IFS (Internal Field Separator) system variable stores the character that separates command line arguments.
# We can use it to replace spaces with underscores.
temp=$IFS
IFS='_'
description="$*"
IFS=$temp

if [ $# -eq 0 ]; then
  $record_command $target_directory$temporary_file_prefix`date +%Y%m%d_%H%M%S`.mkv
else
  $record_command $target_directory$temporary_file_prefix`date +%Y%m%d_%H%M%S`_$description.mkv
fi


Обработка записанных файлов - myproc

  1. Создайте текстовый файл
  2. Сохраните его как myproc (или любое другое имя, которое вам подходит)
  3. Сделайте myproc исполняемым, выполнив команду: chmod +x myproc
  4. Вставьте в него следующий код и измените раздел Настройки пользователя в соответствии с вашей установкой:


#!/bin/bash

echo "Compress files recorded with myrec or myrec-novideo."
echo "For files to be processed they need to reside in the storage directory and start with temp_"
echo "The two audio tracks (mic and speakers) are mixed together into one new stream, but they are also available as separate tracks in the final file."

# Mixing is because players I know cannot play two audio tracks from the same file simultaneously.
# The mic also captures sounds produced by the speakers. It has two effects:
# 1. You can use this single track to hear both yourself (the mic) and whatever came out of your speakers. Personally I did not like the degraded quality of recorded speaker sounds, hence the direct recording off the sound card and mixing that with the mic track.
# 2. Speaker sounds recorded by the mic are slightly delayed when compared to the direct recording off the sound card. The mixed track is thus hard to listen to.
# I do have echo cancellation module loaded in Pulseaudio, perhaps there is something wrong with my configuration?

### User settings

# Indicate storage directory without the trailing slash
storage_directory="/storage/directory/name"

### End of user settings

# Any temp_ file may contain 3 streams (audio, audio, video) indexed as (0, 1, 2), or just 2 streams (audio, audio) indexed as (0, 1).
# A file temp2_ contains just one stream: both audio streams from temp_ mixed.
# The step with temp2_ is necessary as the mixing option (-filter_complex) is a global option (i.e. not stream-specific). Attempts at doing it all in one go prevent the separate tracks from being copied into the final file.

for f in $storage_directory/temp_*
do
  if [ -e ${f/temp_/} ]
  then
    # Do not overwrite an existing final file. Prevents unnecessary work when the script is run regularly as a cron job.
    echo "$f: A final file (without temp_) already exists. Skipping. If you want to reencode, please delete the final file manually."
  else
    # Variable g will contain the name of the second temporary file with both audio streams mixed into one.
    g=${f/temp_/temp2_}

    # Mixing mic and sound card tracks into one stream
    ffmpeg -i "$f" -map 0:0 -map 0:1 -filter_complex amix=inputs=2:duration=longest:dropout_transition=2 -codec:a libvorbis -n "$g"

    # Create the final file: copy the mixed audio stream from temp2_, add and compress both separate audio streams from temp_, compress at high quality the video stream from temp_.
    # The question mark in -map 0:2? tells ffmpeg to ignore the error if this stream (video) is missing. Allows this same script to be used for audio-only recordings.
    ffmpeg -i "$f" -i "$g" -map 1:0 -map 0:0 -map 0:1 -map 0:2? -codec:a:0 copy -codec:a:1 libvorbis -codec:a:2 libvorbis -codec:v libx264 -qp 18 -preset slow -threads 0 -n "${g/temp2_/}"

    # Delete temp2_
    rm "$g"
  fi
done


Благодаря гибкости ffmpeg, myproc может обрабатывать файлы, которые могут содержать или не содержать видеопоток.


Как использовать скрипты

  1. Решите, где на вашем экране будет располагаться окно видеозвонка Skype, и установите желаемый размер окна. Skype запомнит эту настройку окна, поэтому вам придется сделать это только один раз. При каждом последующем звонке окно будет появляться в том же месте и того же размера. Не забудьте сообщить myrec о своих настройках. В общем, постарайтесь, чтобы окно видеозвонка находилось рядом с вашей веб-камерой, чтобы у собеседника была возможность думать, что вы смотрите ему в глаза.
  2. Держите открытым окно терминала. Когда вы захотите начать запись, используйте команду:

    • для записи звука и видео: . myrec some description
    • для записи только аудио: . myrec-novideo some description

    some description является необязательной в обоих сценариях. Вы можете использовать клавишу Tab для расширения имен скриптов, чтобы сэкономить на наборе текста. ffmpeg начнет запись в файл с именем temp_YYYYMMDD_HHMMSS_some_description.mkv, где YYYYMMDD_HHMMSS - дата и время записи.

  3. Нажмите q в окне терминала, где идет запись ffmpeg, как только вы будете готовы остановить запись.
  4. Запустите myproc для обработки (сжатия) файлов. Вы можете сделать это вручную или настроить задание cron, чтобы оно выполнялось, пока вы отсутствуете.
  5. Как только вы убедитесь, что сжатие прошло как ожидалось, удалите файл temp_.


Проблемы

  1. Невозможно указать микрофон по имени, можно использовать только специальное значение default. Раньше я указывал там имя микрофона, но эта настройка перестала работать после обновления системы. Это может быть что-то ограниченное только моей настройкой или pulseaudio.
  2. Звук микрофона содержит мой голос и звук из динамиков. Звук из динамиков немного отстает от аудиопотока, записанного непосредственно со звуковой карты. Загружен модуль эхоподавления Pulse, но я думаю, что он предназначен только для подавления эха моего собственного голоса. Дело в том, что когда микрофонный звук смешивается со звуком звуковой карты, небольшая задержка делает результирующий поток трудным для прослушивания. Есть ли у кого-нибудь идея, как предотвратить запись микрофоном звука из динамиков?


Заключительные замечания

Я надеюсь, что вы найдете эти инструменты полезными. Я с нетерпением жду ваших мыслей по улучшению и комментариев.

8
27.01.2020, 19:39

Open Broadcaster Software (OBS) Studio объединяет все эти требования в простой в использовании интерфейс.

Это открытый исходный код и кросс-платформенный:

Для Ubuntu 15.04 и более поздних версий:

sudo add-apt-repository ppa:obsproject/obs-studio
sudo apt-get update && sudo apt-get install obs-studio ffmpeg

Для других дистрибутивов / более ранних версий Ubuntu ознакомьтесь с git wiki

5
27.01.2020, 19:39

Теги

Похожие вопросы