sudo chown user:user /dev/input/by-id/usb-Logitech_USB_Keyboard-event-kbdДалее для снятия дампа в hex-виде предлагаю такую замысловатую команду:
sleep 1 ; hexdump -e '24/1 " %02X" "\n"' /dev/input/by-id/usb-Logitech_USB_Keyboard-event-kbd /dev/input/by-id/usb-Logitech_USB_Keyboard-event-kbd & sleep 5 ; pkill hexdumpЗдесь через 1 секунду (sleep 1, чтобы нажатие Enter не попало в дамп) начнется захват данных с клавиатуры, будет выводиться по 24 байта на строку (24/1), еще через 5 секунд (sleep 5) захват будет остановлен (pkill hexdump, чтобы мы смогли вновь пользоваться клавиатурой после снятия дампа).
sleep 1 ; hexdump -e '24/1 " %02X" "\n"' /dev/input/by-id/usb-Logitech_USB_Keyboard-event-kbd /dev/input/by-id/usb-Logitech_USB_Keyboard-event-kbd & sleep 5 ; pkill hexdump [1] 14693 15 87 FC 5D 00 00 00 00 40 CA 07 00 00 00 00 00 04 00 04 00 3A 00 07 00 15 87 FC 5D 00 00 00 00 40 CA 07 00 00 00 00 00 01 00 3B 00 01 00 00 00 15 87 FC 5D 00 00 00 00 40 CA 07 00 00 00 00 00 00 00 00 00 00 00 00 00 15 87 FC 5D 00 00 00 00 3E C4 08 00 00 00 00 00 04 00 04 00 3A 00 07 00 15 87 FC 5D 00 00 00 00 3E C4 08 00 00 00 00 00 01 00 3B 00 00 00 00 00 15 87 FC 5D 00 00 00 00 3E C4 08 00 00 00 00 00 00 00 00 00 00 00 00 00 16 87 FC 5D 00 00 00 00 37 C4 08 00 00 00 00 00 04 00 04 00 3A 00 07 00 16 87 FC 5D 00 00 00 00 37 C4 08 00 00 00 00 00 01 00 3B 00 01 00 00 00 16 87 FC 5D 00 00 00 00 37 C4 08 00 00 00 00 00 00 00 00 00 00 00 00 00 16 87 FC 5D 00 00 00 00 75 60 09 00 00 00 00 00 04 00 04 00 3A 00 07 00 16 87 FC 5D 00 00 00 00 75 60 09 00 00 00 00 00 01 00 3B 00 00 00 00 00 16 87 FC 5D 00 00 00 00 75 60 09 00 00 00 00 00 00 00 00 00 00 00 00 00
struct input_event {
struct timeval time;
__u16 type;
__u16 code;
__s32 value;
};
Структура имеет размер 24 байта (на 64-битной системе), именно поэтому выше мы выводили дамп по 24 байта на строку.Первое поле структуры input_event — также структура, timeval. Использовалась 64-битная система, поэтому timeval состояла из двух 64-битных (по 8 байт) целых чисел — значения секунд и микросекунд. По первым 8 байтам каждой строки дампа видно, как меняется значение секунд (почти не меняется, только первый байт поменялся с 15 на 16, когда секунда "тикнула"). Следующие 8 байт каждой строки отвечают за микросекунды, а потому меняются хаотично (нажатие/отпускание кнопки F1 приходилось на произвольную долю секунд).
А самое интересное происходит в последних восьми байтах каждой строки дампа. Сначала идет двухбайтное поле type — его значение менялось с 4 (EV_MSC — некая дополнительная информация, разбирать ее не будем) на 1 (EV_KEY — непосредственно событие кнопки клавиатуры) и 0 (EV_SYN — разделитель).
Разберем события EV_KEY, их было всего 4:
15 87 FC 5D 00 00 00 00 40 CA 07 00 00 00 00 00 01 00 3B 00 01 00 00 00 15 87 FC 5D 00 00 00 00 3E C4 08 00 00 00 00 00 01 00 3B 00 00 00 00 00 16 87 FC 5D 00 00 00 00 37 C4 08 00 00 00 00 00 01 00 3B 00 01 00 00 00 16 87 FC 5D 00 00 00 00 75 60 09 00 00 00 00 00 01 00 3B 00 00 00 00 00За полем event следует также двухбайтное поле code — код клавиши. В нашем случае — 3B в hex или 59 в десятичном виде. Смотрим файл input-event-codes.h. Действительно, 59 — это код клавиши F1.
И, наконец, последнее поле — четырехбайтное value. Здесь все просто: значение 1 соответствовало нажатию клавиши F1, значение 0 — отпусканию.
GUI-конвертер pspvc конечно отлично подходит для создания одного-двух фильмов для PSP, удобен быстрым интуитивным доступом к настройкам и возможностью точно сгенерировать превью, однако удобным быть перестаёт в случае необходимости конвертирования целого набора видеофайлов.
В связи с этим выкладываю скрипт для пакетного конвертирования сразу нескольких видеофайлов для просмотра на PSP под Linux с gentoo-wiki с моими небольшими доработками, а именно:
1) Добавлен мини-конфиг: можно прописать путь к перекодированным файлам, задержку при создании превью и путь к ffmpeg (я, как видите,
использую не стандартный ffmpeg, а оный из поставки pspvc)
2) Проблема в том, что если вы перекодировали файл, переместили его на psp, а затем перекодировали ещё один,
имя нового файла так же будет M4V10001.MP4, потому что скрипт конечно не знает о существовании файла с таким же именем на psp
(и, конечно, никто кроме вас об этом не знает).
Я предлагаю решение: каждый раз при запуске скрипта вбивать некое значение (постфикс), которое будет прибавляться к цифровой части имени файла.
Это особенно удобно если вы например кодируете сериал: первый сезон с постфиксом 101, второй 201 и т.п. для получения говорящих имён файлов.
По умолчанию файлы по прежнему начинают именоваться с M4V10001.MP4, так что если не предвидиться конфликтов имён, вместо ввода постфикса можно просто нажать enter.
Собственно листинг:
#!/bin/bash
#script name: make_psp_movie.sh
# Converter for batch video encoding for PSP in Linux.
# http://damnsmallblog.blogspot.com
# Originally: http://gentoo-wiki.com/HOWTO_PSP#Converting_all_your_videofiles_at_once
### CONFIG -->
# Prefix for 100MNV01 dir (originally "/tmp/`echo $LOGNAME`/pspmovies/MP_ROOT/")
prefix="/home/`echo $LOGNAME`"
# Preview pic time position in seconds (originally 5)
ss=10
# Path to ffmpeg binary (originally ffmeg)
ffmpeg=/opt/psp/pspvc/share/pspvc/bin/ffmpeg
### CONFIG <--
if [ $# == 0 ]
then
echo "Use: make_psp_movie video1 video2 video3 ..."
fi
# First file's name postfix - number from 1 to 9999 (originally "1" - file name M4V10001.MP4) -->
output="10000"
postfix=0
until (("1" <= "$postfix" && "$postfix" <= "9999"))
do
echo -n "Enter first file's name postfix (from 1 to 9999): "
read postfix
if [ "$postfix" == "" ]
then
postfix=1
fi
done
let "output += $postfix"
# First file's name postfix - number from 1 to 9999 (originally "1" - file name M4V10001.MP4) <--
# target dir
target="$prefix/100MNV01"
mkdir -p "$target"
for m in "$@"
do
echo "-------------------"
echo "Start converting $m"
echo "-------------------"
#output="10001"
while [ -f "$target/M4V${output}.MP4" ]
do
let "output += 1"
done
#generate video
#If "-r 29.97" does NOT work try "-r 14.985"
$ffmpeg -i "$m" -f psp -r 29.97 -b 768k -ar 24000 -ab 64k -s 320x240 "${target}/M4V${output}.MP4"
#generate thumbnail
$ffmpeg -y -i "$m" -f image2 -ss $ss -vframes 1 -s 160x120 -an "${target}/M4V${output}.THM"
#list the files that were just generated
ls -l "${target}/M4V${output}.MP4" "${target}/M4V${output}.THM"
done
echo
echo "---------------------------------------------------------------------------"
echo "You will find any newly generated PSP videos in:"
echo " ${target}"
echo
echo "Please copy them to your PSP's 'MP_ROOT/100MNV01/' folder."
echo
echo "Note: if that folder doesn't already exist, just create the folders first."
echo "---------------------------------------------------------------------------"