wtorek, 24 grudnia 2013

Vlc strumieniowanie. FFmpeg, Ubuntu Server i kodeki x264

Obecnie podjąłem się długiej i mozolnej walki jak strumień z kamery USB, wysyłany po ethernecie skompresować i wysłać w świat.

W związku z tym, że Ubuntu prowadzi dosyć dziwną, choć uzasadnioną politykę dot. kodeków i oprogramowania nie-do-końca-otwartego, cała operacja wymaga przede wszystkim. Skompilowania na nowo ffmpeg.

W celu... korzystałem z dwóch tutków:
1. Oficjalnego ze strony ffmpeg, który nie do końca działa.
2. Oraz Googlobloga Wireless Video Sensor.

Łącząc te dwa dzieła wyszły mi takie (mniej więcej) komendy*:
*Ponieważ preferuję zabezpieczenie sobie drogi powrotnej, wszystkie programy są instalowane jako paczki, które łatwo jest usunąć (checkinstall).

Ponieważ Yasm na Ubuntu 12.04 jest za stary...:
wget http://www.tortall.net/projects/yasm/releases/yasm-1.2.0.tar.gz
tar xzvf yasm-1.2.0.tar.gz
cd yasm-1.2.0 
./configure 
make -j2
sudo checkinstall
Wywalamy co nam może przeszkadzać i instalujemy co może** się przydać:
**może, bo instaluję wszystko hurtem. Miejsce mam, a nie chce mi się bawić w poszukiwanie brakujących bibliotek i ich doinstalowywanie - ktoś już to zrobił za mnie.
sudo aptitude remove ffmpeg x264 libx264-dev

sudo aptitude install build-essential checkinstall git libfaac-dev libjack-jackd2-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libsdl1.2-dev libtheora-dev libva-dev libvdpau-dev libvorbis-dev libavfilter-dev libfreetype6-dev libvpx-dev libxfixes-dev texi2html zlib1g-dev 


sudo aptitude install libgnutls-dev sudo aptitude install libass-dev 

sudo aptitude install libdirac-dev 

sudo aptitude install libgsm1-dev sudo aptitude install libgsmme-dev 
sudo aptitude install libmodplug-dev sudo aptitude install libopenjpeg-dev 
sudo aptitude install librtmp-dev sudo aptitude install libschroedinger-dev 
sudo aptitude install libspeex-dev sudo aptitude install libvo-aacenc-dev 
sudo aptitude install libvo-amrwbenc-dev sudo aptitude install libxvidcore-dev sudo aptitude install libopenal-dev libdc1394-22-dev libv4l-dev 
sudo aptitude install libcdio-dev libcdio-cdda-dev libcdio-paranoia-dev

Teraz instalujemy x264:
git clone git://git.videolan.org/x264 cd x264 ./configure --enable-static --enable-shared --enable-debug --enable-gprof 
make 

sudo checkinstall --pkgname=x264 --pkgversion="3:$(./version.sh | \ awk -F'[" ]' '/POINT/{print $4"+git"$5}')" --backup=no --deldoc=yes \ --fstrans=no --default
oraz FFmpeg. Ucięte wszystko, pozostawione jedynie dekodowanie tego co wysłane zostało w formacie mjpeg i przekonwertowanie tego do h264 bez dźwięku:

 [todo] ./configure --enable-gpl --enable-libx264 --enable-libopenjpeg --enable-nonfree

niedziela, 22 grudnia 2013

Przykładowa komenda do streamowania kamery USB przy pomocy VLC

Przed dokonaniem poniższych komend należy wykonać sudo chmod 777 /dev/video* [sudo adduser <myuser> video nie zadziała], aby łatwiej operowało się na plikach reprezentujących kamery (do sprawdzenia).

vlc -I dummy v4l2c:///dev/video2 --sout '#standard{access=http,mux=ogg,dst=:8080}'
add. kilka uwag:
fps=5 jest jeszcze nie zaimplementowane
--v4l2-color-killer nie daje efektu
chroma=mjpg do sprawdzenia

aby ustawić jakość na maksimum (jpeg) trzeba sprawdzić jakie możliwości daje nam kamera (źródło):
vlc@mini:~$ v4l2-ctl -d /dev/video1 -l

User Controls

                     brightness (int)    : min=0 max=255 step=1 default=128 value=128 flags=slider
                       contrast (int)    : min=0 max=255 step=1 default=128 value=128 flags=slider
                          gamma (int)    : min=1 max=6 step=1 default=3 value=3 flags=slider
                 gain_automatic (bool)   : default=1 value=1
           power_line_frequency (menu)   : min=0 max=2 default=0 value=0
                      sharpness (int)    : min=0 max=3 step=1 default=2 value=2 flags=slider

JPEG Compression Controls

            compression_quality (int)    : min=50 max=87 step=1 default=75 value=87

i, aby ustawić maksymalną jakość:
v4l2-ctl -d /dev/video1 --set-ctrl compression_quality=87 
add end.

Ciekawym zjawiskiem jest to, że przy takich ustawieniach dwie kamery [NGS Bullseye Twin] nie chcą się uruchomić (vlc na nic nie krzyczy, ale w dmesgu pojawiają się informacje typu:

gspca_zc3xx 2-1:1.0: alt 6 - bandwidth not wide enough, trying again
<3>ohci-pci 0000:00:0f.4: leak ed c6b32100 (#81) state 2
gspca_zc3xx 2-1:1.0: alt 5 - bandwidth not wide enough, trying again
ohci-pci 0000:00:0f.4: leak ed c6b32480 (#81) state 2
gspca_main: ISOC data error: [0] len=144, status=-70
Stanowi to niemały problem i wymaga dalszego badania. Obejściem tego problemu, w wypadku tych kamer może być wydanie komendy:
vlc -I dummy v4l2c:///dev/video1:width=320:height=240:chroma=mjpg:fps=5 --v4l2-color-killer --sout '#standard{access=http,mux=ts,dst=:8081}'
I tu dochodzimy do tego ciekawego momentu. Otóż, strumieniowanie działa, a w dmesgu nic niepokojącego się nie pojawia, a obraz i tak jest 640x480.

chroma=mjpg:fps=5 --v4l2-color-killer mogą być niepotrzebne

środa, 18 grudnia 2013

Szybka zmiana rozmiarów wielu obrazów

Convert to świetne i potężne narzędzie do operowania obrazami. (nie)stety tekstowe.

Szybka zmiana rozmiaru wielu obrazów może wyglądać tak:

mkdir resized
for i in *.jpg; do
convert $i -resize 800×600 resized/$i
done
 Źródło:
mogrify -resize 800x600 *.jpg

Grub (legacy) dla systemu na USB

Korzystałem z dwóch tutków i nie do końca wiem który zadziałał.
Tut I i Tut II.

W skrócie:
1. Tworzymy katalog /boot/grub.
2. Do katalogu wrzucamy zawartość /usr/lib/grub/i386-pc. Ważne, by pliki były z wersji 32/64 odpowiednio dla systemu (tu pewny nie jestem, ale były problemy, gdy kopiowałem z 64).
3. Nic nie odmontowujemy. echo '(hd0) /dev/sdu' > /mnt/boot/grub/device.map. Gdzie sdu, to nasz gwizdek, a /mnt, to punkt jego montowania.
4. grub-install --root-directory=/mnt /dev/sdu.

Alternatywna 4., w grub:

- find /boot/grub/stage1 #zwróci potencjalne dyski
- root (hd1,0)
- setup (hd1)

Przykładów /boot/grub/menu.lst jest w internecie pod dostatkiem.

wtorek, 17 grudnia 2013

Informacje o dysku

Na podstawie strony:
sudo hdparm -I /dev/sda
 Przykładowe wyjście:

/dev/sda:

ATA device, with non-removable media
    Model Number:       ST500LT012-9WS142                      
    Serial Number:      W0V46WGG
    Firmware Revision:  0001SDM1
    Transport:          Serial, ATA8-AST, SATA 1.0a, SATA II Extensions, SATA Rev 2.5, SATA Rev 2.6
Standards:
    Used: unknown (minor revision code 0x0029)
    Supported: 8 7 6 5
    Likely used: 8
Configuration:
    Logical        max    current
    cylinders    16383    16383
    heads        16    16
    sectors/track    63    63
    --
    CHS current addressable sectors:   16514064
    LBA    user addressable sectors:  268435455
    LBA48  user addressable sectors:  976773168
    Logical  Sector size:                   512 bytes
    Physical Sector size:                  4096 bytes
    Logical Sector-0 offset:                  0 bytes
    device size with M = 1024*1024:      476940 MBytes
    device size with M = 1000*1000:      500107 MBytes (500 GB)
    cache/buffer size  = 16384 KBytes
    Form Factor: 2.5 inch
    Nominal Media Rotation Rate: 5400
Capabilities:
    LBA, IORDY(can be disabled)
    Queue depth: 32
    Standby timer values: spec'd by Standard, no device specific minimum
    R/W multiple sector transfer: Max = 16    Current = 16
    Advanced power management level: 128
    Recommended acoustic management value: 208, current value: 0
    DMA: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 udma5 *udma6
         Cycle time: min=120ns recommended=120ns
    PIO: pio0 pio1 pio2 pio3 pio4
         Cycle time: no flow control=120ns  IORDY flow control=120ns
Commands/features:
    Enabled    Supported:
       *    SMART feature set
            Security Mode feature set
       *    Power Management feature set
       *    Write cache
       *    Look-ahead
       *    Host Protected Area feature set
       *    WRITE_BUFFER command
       *    READ_BUFFER command
       *    NOP cmd
       *    DOWNLOAD_MICROCODE
       *    Advanced Power Management feature set
            Power-Up In Standby feature set
       *    SET_FEATURES required to spinup after power up
            SET_MAX security extension
       *    48-bit Address feature set
       *    Device Configuration Overlay feature set
       *    Mandatory FLUSH_CACHE
       *    FLUSH_CACHE_EXT
       *    SMART error logging
       *    SMART self-test
       *    General Purpose Logging feature set
       *    WRITE_{DMA|MULTIPLE}_FUA_EXT
       *    64-bit World wide name
       *    IDLE_IMMEDIATE with UNLOAD
       *    Write-Read-Verify feature set
       *    WRITE_UNCORRECTABLE_EXT command
       *    {READ,WRITE}_DMA_EXT_GPL commands
       *    Segmented DOWNLOAD_MICROCODE
       *    Gen1 signaling speed (1.5Gb/s)
       *    Gen2 signaling speed (3.0Gb/s)
       *    Native Command Queueing (NCQ)
       *    Host-initiated interface power management
       *    Phy event counters
       *    Idle-Unload when NCQ is active
            Device-initiated interface power management
       *    Software settings preservation
       *    SMART Command Transport (SCT) feature set
       *    SCT Write Same (AC2)
       *    SCT Features Control (AC4)
       *    SCT Data Tables (AC5)
            unknown 206[12] (vendor specific)
Security:
    Master password revision code = 65534
        supported
    not    enabled
    not    locked
        frozen
    not    expired: security count
        supported: enhanced erase
    104min for SECURITY ERASE UNIT. 104min for ENHANCED SECURITY ERASE UNIT.
Logical Unit WWN Device Identifier: 5000c5005db86e24
    NAA        : 5
    IEEE OUI    : 000c50
    Unique ID    : 05db86e24
Checksum: correct

czwartek, 12 grudnia 2013

Jak rozpakować /proc/config.gz

Zawsze, gdy konfiguruję nowe jądro (dedykowane), dorzucam konfigurację do pliku w /proc. Przydaten, gdy zapomina się o jego odpowiednim przechowywaniu (kopia z datą i 'celem' modyfikacji). Gdy przychodzi czas na wygrzebanie:
[root@PBLinux hints]# cp /proc/config.gz config.gz
[root@PBLinux hints]# bunzip2 config.gz
[root@PBLinux hints]# gunzip config.gz
[root@PBLinux hints]# mv config .config
Info stąd.

środa, 4 grudnia 2013

7zip i "unsupported method"

Część archiwów nie chce się rozpakować przy pomocy 7z.
Prawdopodobnie brakuje w ów czas pakietu obsługującego rar. Zdobyć go można tak:
sudo apt-get install p7zip-full p7zip-rar