PROJET AUTOBLOG


®om's blog

Site original : ®om's blog

⇐ retour index

Mise à jour

Mise à jour de la base de données, veuillez patienter...

Partager sa musique sur réseau local avec Rhythmbox

samedi 8 novembre 2008 à 15:30

Si vous avez plusieurs ordinateurs chez vous, il y a des dizaines de moyens de partager votre musique sur votre réseau local.

En voici une très simple, grâce à Rhythmbox (le lecteur par défaut d’Ubuntu).

Pour activer le partage, dans Édition → Greffons, il suffit d’activer Partage de musique DAAP (cette case est déjà activée par défaut dans Ubuntu 8.10), de cliquer sur Configurer, et d’activer Partager ma musique.

rhythmbox-enable-share

rhythmbox-share-dialog

Vous obtiendrez une nouvelle entrée dans le menu de gauche de Rhythmbox, et vous pourrez lire directement toute la musique se trouvant sur un autre ordinateur :

rhythmbox-share

Rhythmbox doit resté ouvert sur l’ordinateur “serveur”.

pspxconv : script d'encodage de vidéos pour PSP

mercredi 29 octobre 2008 à 17:37

J’ai récemment acheté une PSP, et je voulais pouvoir encoder mes vidéos facilement, avec les réglages que je voulais. J’ai donc écrit un script.

Il s’utilise comme ceci :

pspxconv fichier.avi fichier.mp4 500

si l’on veut convertir un .avi en .mp4 lisible par la PSP avec un bitrate vidéo de 500Kbps (pour l’instant le bitrate audio est fixé à 96).

Il est également possible de définir une qualité constante plutôt qu’un bitrate moyen (préférable pour -hurry et -afap) :

pspxconv fichier.avi fichier.mp4 q20 -hurry

Plusieurs presets de qualité sont disponibles :

On peut aussi rajouter des options de mencoder :

pspxconv fichier.avi fichier.mp4 500 -std -ss 10 -endpos 100

n’encodera que de 10s à 110s.

pspxconv fichier.avi fichier.mp4 500 -std -audiofile fichier.mp3

encodera la vidéo .avi en utilisant la bande son .mp3.

Ce qu’il reste à améliorer (votre aide est la bienvenue) :

Voici le script :

#!/bin/sh
# pspxconv : video encoding script for PSP
#
# 28th october 2008 - Romain Vimont (®om)
#
# v0.4 (25th june 2009)
#
# Converts input video and audio to mp4 { x264|mpeg4 + faac }, accepted by PSP.
#
# Syntax:
#   pspxconv input_file output_mp4 video_bitrate [quality_preset]
#     [mencoder_options [...]]
#
# video_bitrate can be an integer, or can define a quantifier if it starts
#   with q : q19.5 for example.
#
# quality_preset must be one of :
#   -afap : as fast as possible (poor quality mpeg4, 1 pass, fastest)
#   -hurry : (default) quite fast (poor quality, x264, 1 pass, fast)
#   -std :  standard quality (good quality, normal)
#   -hq  : high quality (very good quality, slow)
#   -vhq : very high quality (best quality, very slow)
#
# mencoder_options are appended to command line of mencoder call.
# For example :
#   -ss 10 -endpos 56 : trim the video from 10s to 66s.
#
# (of course, there are no options -afap, -hurry, -std, -hq nor -vhq)
#

# Syntax error detected.
# Exits the program with return code 1.
syntax_error() {
    printf '%s%s\n' "Syntaxe : $0 input_file output_mp4 video_bitrate " \
      '[quality_preset] [mencoder_options [...]]' >&2
    exit 1
}

# Indicates whether the argument represents an integer.
#
# $1: value to test
# return: the integer if the argument represents an integer, an empty string if
#   it doesn't
is_integer() {
    local value="$1"
    printf %s "$1" | grep -o '^[[:digit:]]\+$'
}

# Returns the quantification value if the bitrate represents such a value.
#
# $1: value to test
# return: the value if the argument represents a quantifier, an empty string if
#   it doesn't
get_q_value() {
    local value="$1"
    printf %s "$1" | grep -o '^q[[:digit:]]\+\(\.[[:digit:]]\+\)\?$' | cut -c2-
}

# Gets a unique id, based on the clock (seconds + nanoseconds).
# 
# return: unique id
uid() {
    date +'%s%N'
}

# Indicates whether the encoder must use x264 codec.
#
# $1: preset
# return: 'yes' if it must use it, nothing otherwise
use_x264() {
    local preset="$1"
    if [ "$preset" != '-afap' ]
    then
        printf 'yes'
    fi
}

# Returns the x264opts command line arguments for the selected preset.
#
# $1: preset
# return: command line arguments
x264_preset() {
    local preset="$1"
    local common='global_header:threads=auto'
#vbv_maxrate=1536:vbv_bufsize=2000:level_idc=30
    local common_q="$common:bframes=1:b_adapt:b_pyramid:weight_b:trellis=2"
    local q_value=$(get_q_value "$q")
    if [ "$q_value" ]
    then
        printf "crf=$q_value:"
    else
        printf "bitrate=$q:"
    fi
    case "$preset" in
    '-hurry') printf "$common:me=dia:subq=1" ;;
    '-std')  printf "$common_q" ;;
    '-hq')   printf "$common_q:me=umh:subq=6" ;;
    '-vhq')  printf "$common_q:me=esa:subq=7" ;;
    esac
}

# Returns the lavcopts command line arguments for the selected preset.
#
# return: command line arguments
mpeg4_preset() {
    local q_value=$(get_q_value "$q" | sed 's/\..*$//')
    if [ "$q_value" ]
    then
        printf "vqscale=$q_value:"
    else
        printf "vbitrate=$q:"
    fi
    printf 'aglobal=1:vglobal=1'
}

# Indicates whether the preset needs 2 passes.
#
# $1: preset
# return: '2' if the selected preset have 2 passes, nothing otherwise
two_passes_preset() {
    local preset="$1"
    if [ "$preset" != '-afap' -a "$preset" != '-hurry' ]
    then
        printf 2
    fi
}

# Indicates the scale selected for the preset.
#
# $1: preset
# return: width:height scaling
scale_preset() {
    local preset="$1"
    case "$preset" in
    '-afap')  printf 'dsize=320:240:0:16,scale=0:0' ;;
    *)        printf 'dsize=480:272:0:16,scale=0:0'
    esac
}

# error when less than 3 arguments
[ $# -ge 3 ] || syntax_error

# reads the arguments
in="$1"; shift
out="$1"; shift
q="$1"; shift


# audio bitrate
ab=96

# input file must exist
if [ ! -f "$in" ]
then
    printf '%s\n' "Input file doesn't exist : $in" >&2
    exit 2
fi

# bitrate value must be integer or quantifier
if [ ! "$(is_integer "$q")" -a ! "$(get_q_value "$q")" ]
then
    printf '%s\n' "Bitrate value must be integer : $bitrate" >&2
    exit 3
fi

# gets a unique filename, in order to avoid collisions when encoding two video
# at the same time
uid=$(uid)
tmp_log=$(printf '%s' "/tmp/$uid.log")

# chooses the quality preset
quality='-hurry'
if [ "$1" = '-afap' -o "$1" = '-hurry' -o "$1" = '-std' -o "$1" = '-hq' \
  -o "$1" = '-vhq' ]
then
    quality="$1"
    shift
fi

vf=$(scale_preset "$quality")

if [ $(use_x264 "$quality") ]
then
    # gets the x264 options
    opts=$(x264_preset $quality)
    if [ $(two_passes_preset "$quality") ]
    then
        # encodes the first pass
        mencoder "$in" -o /dev/null -of lavf -lavfopts format=mp4 -passlogfile \
        "$tmp_log" -ovc x264 -x264encopts "$opts:pass=1" \
        -vf "$vf" -nosound $@ &&

        # encodes the second pass
        mencoder "$in" -o "$out" -of lavf -lavfopts format=mp4 -passlogfile \
        "$tmp_log" -ovc x264 -x264encopts "$opts:pass=2" \
        -vf "$vf" -oac faac \
        -faacopts br=$ab:raw=yes:object=2 $@ &&

        exit 0
    else
        # encodes the unique pass
        mencoder "$in" -o "$out" -of lavf -lavfopts format=mp4 -passlogfile \
        "$tmp_log" -ovc x264 -x264encopts "$opts" \
        -vf "$vf" -oac faac \
        -faacopts br=$ab:raw=yes:object=2 $@ &&

        exit 0
    fi
else
    # encodes the unique pass
    mencoder "$in" -o "$out" -of lavf -lavfopts format=mp4 -passlogfile \
    "$tmp_log" -ovc lavc -lavcopts $(mpeg4_preset) -vf "$vf" -oac faac \
    -faacopts br=$ab:raw=yes:object=2 $@ &&

    exit 0
fi

pastebinit : postez vos fichiers en ligne de commande

samedi 11 octobre 2008 à 11:18

Ceux qui vont souvent sur IRC connaissent pastebin, qui permet de poster plusieurs lignes (un fichier de config par exemple) sans flooder le chan.

Je me suis dit que ce serait bien de faire un script qui automatise tout cela, pour envoyer son fichier en ligne de commande. Avant de le commencer, je regarde quand même si ça n’existe pas déjà : oui, évidemment, ça existe déjà :)

Il suffit donc d’installer le paquet pastebinit.

Ensuite, l’utilisation est très simple :

pastebinit /etc/X11/xorg.conf

L’utilisateur par défaut est $USER (le nom système de l’utilisateur). Il est possible de le changer :

pastebinit -a 'moi' /etc/X11/xorg.conf

On peut également utiliser la coloration syntaxique :

pastebinit -f bash /usr/bin/compiz

Il est possible de poster l’entrée standard :

pastebinit <<< 'mon premier paste'

Le programme donne en retour le résultat sur la sortie standard. On peut donc ouvrir directement la page dans le navigateur :

xdg-open $(pastebinit /etc/X11/xorg.conf)

Améliorer les performances nvidia sous compiz-fusion

mardi 7 octobre 2008 à 13:22

Ce billet s’adresse aux possesseurs de carte graphique nvidia qui utilisent compiz-fusion.

Tout d’abord, pour que compiz prennent en compte les paramètres de nvidia-settings au démarrage (vblank, anti-aliasing, anisotropic…), il faut que la commande nvidia-settings -l soit exécutée avant le lancement de compiz.

Pour cela, j’ai proposé un patch qui consiste à rajouter un fichier dans /etc/X11/Xsession.d, en espérant qu’il soit intégré à la version finale d’Intrepid.

En attendant, le plus simple est de rajouter la ligne dans ~/.gnomerc (créer le fichier s’il n’existe pas) :

nvidia-settings -l

NB: l’anti-aliasing provoque quelques problèmes avec compiz.

Maintenant, que la configuration de nvidia-settings est prise en compte, optimisons les performances.

Pour cela, toujours dans ~/.gnomerc, il faut rajouter la ligne :

nvidia-settings -a InitialPixmapPlacement=2 -a GlyphCache=1

Et dans /etc/X11/xorg.conf, dans la Section "Device" correspondant à la carte graphique, il faut rajouter :

    Option     "PixmapCacheSize" "1000000"
    Option     "AllowSHMPixmaps" "0"

ce qui donne, chez moi :

Section "Device"
    Identifier "Configured Video Device"
    Driver     "nvidia"
    Option     "NoLogo" "True"
    Option     "PixmapCacheSize" "1000000"
    Option     "AllowSHMPixmaps" "0"
EndSection

puis redémarrer le serveur X.

Rassurez-vous, je n’ai pas inventé toutes ces modifications, elles sont fortement recommandées par nvidia, en attendant d’avoir les bonnes valeurs par défaut dans une version future. Plus d’infos ici.

Voici une amélioration directe suite à ces modifications : dans ccsm, si dans le plugin “redimensionner la fenêtre” le mode de redimensionnement est sur l’option “Normal”, les redimensionnements de fenêtres sont très très lents. C’est pour cela que j’utilisais plutôt le mode “Stretch”.

Après les modifications, les performances sont beaucoup plus correctes (ça n’est pas parfait, mais c’est déjà ça).

sed : changer de séparateur

mardi 30 septembre 2008 à 16:03

Si vous effectuez quelques traitements simples en ligne de commande, vous connaissez forcément l’outil sed, et plus particulièrement la commande :

sed 's/ancien/récent/'

qui permet de remplacer ancien par récent :

$ sed 's/ancien/récent/' <<< 'ce système est ancien, voire très ancien'
ce système est récent, voire très ancien

Pour remplacer toutes les occurrences, on rajoute un g :

$ sed 's/ancien/récent/g' <<< 'ce système est ancien, voire très ancien'
ce système est récent, voire très récent

Cependant, la syntaxe est assez lourde lorsqu’on veut remplacer des /, par exemple pour remplacer /home/rom/sh/ par /usr/bin/ :

$ sed 's/\/home\/rom\/sh\//\/usr\/bin\//' <<< /home/rom/sh/myscript
/usr/bin/myscript

Heureusement, il est possible de changer le séparateur, et très facilement : c’est simplement le caractère après le s, et on met ce que l’on veut :

$ sed 's:/home/rom/sh:/usr/bin:' <<< /home/rom/sh/myscript
/usr/bin/myscript
$ sed 's|/home/rom/sh|/usr/bin|' <<< /home/rom/sh/myscript
/usr/bin/myscript

(il suffit de backslasher le caractère qui sert de séparateur dans les tokens)

Allez, pour s’amuser :

sed sachagena <<< 'des choux'
sed subucu <<< 'trop bon'
Error happened! 0 - Call to undefined function simplexml_load_string() In: /var/www/Projet-Autoblog/autoblogs/autoblog.php:364 http://www.couturat.fr/Projet-Autoblog/autoblogs/blogrom1vcom_4af8d17d34d978843ff2ff40339aa5760e6458bc/?25 #0 /var/www/Projet-Autoblog/autoblogs/autoblog.php(932): VroumVroum_Blog->update() #1 /var/www/Projet-Autoblog/autoblogs/blogrom1vcom_4af8d17d34d978843ff2ff40339aa5760e6458bc/index.php(1): require_once('/var/www/Projet...') #2 {main}