Recherche avancée

Médias (91)

Autres articles (91)

  • L’utiliser, en parler, le critiquer

    10 avril 2011

    La première attitude à adopter est d’en parler, soit directement avec les personnes impliquées dans son développement, soit autour de vous pour convaincre de nouvelles personnes à l’utiliser.
    Plus la communauté sera nombreuse et plus les évolutions seront rapides ...
    Une liste de discussion est disponible pour tout échange entre utilisateurs.

  • Mediabox : ouvrir les images dans l’espace maximal pour l’utilisateur

    8 février 2011, par

    La visualisation des images est restreinte par la largeur accordée par le design du site (dépendant du thème utilisé). Elles sont donc visibles sous un format réduit. Afin de profiter de l’ensemble de la place disponible sur l’écran de l’utilisateur, il est possible d’ajouter une fonctionnalité d’affichage de l’image dans une boite multimedia apparaissant au dessus du reste du contenu.
    Pour ce faire il est nécessaire d’installer le plugin "Mediabox".
    Configuration de la boite multimédia
    Dès (...)

  • D’autres logiciels intéressants

    12 avril 2011, par

    On ne revendique pas d’être les seuls à faire ce que l’on fait ... et on ne revendique surtout pas d’être les meilleurs non plus ... Ce que l’on fait, on essaie juste de le faire bien, et de mieux en mieux...
    La liste suivante correspond à des logiciels qui tendent peu ou prou à faire comme MediaSPIP ou que MediaSPIP tente peu ou prou à faire pareil, peu importe ...
    On ne les connais pas, on ne les a pas essayé, mais vous pouvez peut être y jeter un coup d’oeil.
    Videopress
    Site Internet : (...)

Sur d’autres sites (8651)

  • Further Dreamcast Hacking

    3 février 2011, par Multimedia Mike — Sega Dreamcast

    I’m still haunted by Sega Dreamcast programming, specifically the fact that I used to be able to execute custom programs on the thing (roughly 8-10 years ago) and now I cannot. I’m going to compose a post to describe my current adventures on this front. There are 3 approaches I have been using : Raw, Kallistios, and the almighty Linux.


    Raw
    What I refer to as "raw" is an assortment of programs that lived in a small number of source files (sometimes just one ASM file) and could be compiled with the most basic SH-4 toolchain. The advantage here is that there aren’t many moving parts and not many things that can possibly go wrong, so it provides a good functional baseline.

    One of the original Dreamcast hackers was Marcus Comstedt, who still has his original DC material hosted at the reasonably easy-to-remember URL mc.pp.se/dc. I can get some of these simple demos to work, but not others.

    I also successfully assembled and ran a pair of 256-byte (!!) demos from this old DC scene page.

    KallistiOS
    KallistiOS (or just KOS) was a real-time OS developed for the DC and was popular among the DC homebrew community. All the programming I did back in the day was based around KOS. Now I can’t get any of it to work. More specifically, KOS can’t seem to make it past a certain point in its system initialization.

    The Linux Option
    I was never that excited about running Linux on my Dreamcast. For some hackers, running Linux on a given piece of consumer electronics is the highest attainable goal. Back in the day, I looked at it from a much more pragmatic perspective— I didn’t see much use in running Linux on the DC, not as much as running KOS which was developed to be a much more appropriate fit.

    However, I was able to burn a CD-R of an old binary image of Linux 2.4.5 compiled for the Dreamcast and boot it some months ago. So I at least have a feeling that this should work. I have never cross-compiled a kernel of my own (though I have compiled many, many x86 kernels in my time, so I’m not a total n00b in this regard). I figured this might be a good time to start.

    The first item that worries me is getting a functional cross-compiling toolchain. Fortunately, a little digging in the Linux kernel documentation pointed me in the direction of a bunch of ready-made toolchains hosted at kernel.org. So I grabbed one of the SH toolchains (gcc-4.3.3-nolibc) and got rolling.

    I’m well familiar with the cycle of 'make menuconfig' in order to pick configuration options, and then 'make' to build a kernel (or usually 'make zImage' or 'make bzImage' to create compressed images). For cross compiling, the primary difference seems to be editing the root Makefile in the Linux source code tree (I’m using 2.6.37, the latest stable as of this writing) and setting a value for the CROSS_COMPILE variable. Then, run 'make menuconfig' followed by 'make' as normal.

    The Linux 2.6 series is supposed to support a range of Renesas (formerly Hitachi) SH processors and board configurations. This includes reasonable defaults for the Sega Dreamcast hardware. I got it all compiling except for a series of .S files. Linus Torvalds once helped me debug a program I work on so I thought I’d see if there was something I could help debug here.

    The first issue was with ASM statements of a form similar to :

    mov #0xffffffe0, r1
    

    Now, the DC’s SH-4 is a RISC CPU. A lot of RISC architectures adopt a fixed instruction size of 32 bits. You can’t encode an entire 32-bit immediate value inside of a 32-bit instruction (there would be no room for the instruction encoding). Further, the SH series encoded instructions with a mere 16 bits. The move immediate data instruction only allows for an 8-bit, sign-extended value.

    I decided that the above statement is equivalent to :

    mov #-32, r1
    

    I’ll give this statement the benefit of the doubt that it used to work with the gcc toolchain somewhere along the line. I assume that the assembler is supposed to know enough to substitute the first form with the second.

    The next problem is that an ’sti’ instruction shows up in a number of spots. Using Intel x86 conventions, this is a "set interrupt flag" instruction (I remember that the 6502 CPU had the same instruction mnemonic, though its interrupt flag’s operation was opposite that of the x86). The SH-4 reference manual lists no ’sti’ instruction. When it gets to these lines, the assembler complains about immediate move instructions with too large data, like the instructions above. I’m guessing they must be macro’d to something else but I failed to find where. I commented out those lines for the time being. Probably not that smart, but I want to keep this moving for now.

    So I got the code to compile into a kernel file called ’vmlinux’. I’ve seen this file many times before but never thought about how to get it to run directly. The process has usually been to compress it and send it over to lilo or grub for loading, as that is the job of the bootloader. I have never even wondered what format the vmlinux file takes until now. It seems that ’vmlinux’ is just a plain old ELF file :

    $ file vmlinux
    vmlinux : ELF 32-bit LSB executable, Renesas SH,
    version 1 (SYSV), statically linked, not stripped
    

    The ’dc-tool’ program that uploads executables to the waiting bootloader on the Dreamcast is perfectly cool accepting ELF files (and S-record files, and raw binary files). After a very lengthy upload process, execution fails (resets the system).

    For the sake of comparison, I dusted off that Linux 2.4.5 bootable Dreamcast CD-ROM and directly uploaded the vmlinux file from that disc. That works just fine (until it’s time to go to the next loading phase, i.e., finding a filesystem). Possible issues here could include the commented ’sti’ instructions (could be that they aren’t just decoration). I’m also trying to understand the memory organization— perhaps the bootloader wants the ELF to be based at a different address. Or maybe the kernel and the bootloader don’t like each other in the first place— in this case, I need to study the bootable Linux CD-ROM to see how it’s done.

    Optimism
    Even though I’m meeting with rather marginal success, this is tremendously educational. I greatly enjoy these exercises if only for the deeper understanding they bring for the lowest-level system details.

  • Screeching white sound coming while playing audio as a raw stream

    27 avril 2020, par Sri Nithya Sharabheshwarananda

    I. Background

    



      

    1. I am trying to make an application which helps to match subtitles to the audio waveform very accurately at the waveform level, at the word level or even at the character level.
    2. 


    3. The audio is expected to be Sanskrit chants (Yoga, rituals etc.) which are extremely long compound words [ example - aṅganyā-sokta-mātaro-bījam is traditionally one word broken only to assist reading ]
    4. 


    5. The input transcripts / subtitles might be roughly in sync at the sentence/verse level but surely would not be in sync at the word level.
    6. 


    7. The application should be able to figure out points of silence in the audio waveform, so that it can guess the start and end points of each word (or even letter/consonant/vowel in a word), such that the audio-chanting and visual-subtitle at the word level (or even at letter/consonant/vowel level) perfectly match, and the corresponding UI just highlights or animates the exact word (or even letter) in the subtitle line which is being chanted at that moment, and also show that word (or even the letter/consonant/vowel) in bigger font. This app's purpose is to assist learning Sanskrit chanting.
    8. 


    9. It is not expected to be a 100% automated process, nor 100% manual but a mix where the application should assist the human as much as possible.
    10. 


    



    II. Following is the first code I wrote for this purpose, wherein

    



      

    1. First I open a mp3 (or any audio format) file,
    2. 


    3. Seek to some arbitrary point in the timeline of the audio file // as of now playing from zero offset
    4. 


    5. Get the audio data in raw format for 2 purposes - (1) playing it and (2) drawing the waveform.
    6. 


    7. Playing the raw audio data using standard java audio libraries
    8. 


    



    III. The problem I am facing is, between every cycle there is screeching sound.

    



      

    • Probably I need to close the line between cycles ? Sounds simple, I can try.
    • 


    • But I am also wondering if this overall approach itself is correct ? Any tip, guide, suggestion, link would be really helpful.
    • 


    • Also I just hard coded the sample-rate etc ( 44100Hz etc. ), are these good to set as default presets or it should depend on the input format ?
    • 


    



    IV. Here is the code

    



    import com.github.kokorin.jaffree.StreamType;
import com.github.kokorin.jaffree.ffmpeg.FFmpeg;
import com.github.kokorin.jaffree.ffmpeg.FFmpegProgress;
import com.github.kokorin.jaffree.ffmpeg.FFmpegResult;
import com.github.kokorin.jaffree.ffmpeg.NullOutput;
import com.github.kokorin.jaffree.ffmpeg.PipeOutput;
import com.github.kokorin.jaffree.ffmpeg.ProgressListener;
import com.github.kokorin.jaffree.ffprobe.Stream;
import com.github.kokorin.jaffree.ffmpeg.UrlInput;
import com.github.kokorin.jaffree.ffprobe.FFprobe;
import com.github.kokorin.jaffree.ffprobe.FFprobeResult;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.SourceDataLine;


public class FFMpegToRaw {
    Path BIN = Paths.get("f:\\utilities\\ffmpeg-20190413-0ad0533-win64-static\\bin");
    String VIDEO_MP4 = "f:\\org\\TEMPLE\\DeviMahatmyamRecitationAudio\\03_01_Devi Kavacham.mp3";
    FFprobe ffprobe;
    FFmpeg ffmpeg;

    public void basicCheck() throws Exception {
        if (BIN != null) {
            ffprobe = FFprobe.atPath(BIN);
        } else {
            ffprobe = FFprobe.atPath();
        }
        FFprobeResult result = ffprobe
                .setShowStreams(true)
                .setInput(VIDEO_MP4)
                .execute();

        for (Stream stream : result.getStreams()) {
            System.out.println("Stream " + stream.getIndex()
                    + " type " + stream.getCodecType()
                    + " duration " + stream.getDuration(TimeUnit.SECONDS));
        }    
        if (BIN != null) {
            ffmpeg = FFmpeg.atPath(BIN);
        } else {
            ffmpeg = FFmpeg.atPath();
        }

        //Sometimes ffprobe can't show exact duration, use ffmpeg trancoding to NULL output to get it
        final AtomicLong durationMillis = new AtomicLong();
        FFmpegResult fFmpegResult = ffmpeg
                .addInput(
                        UrlInput.fromUrl(VIDEO_MP4)
                )
                .addOutput(new NullOutput())
                .setProgressListener(new ProgressListener() {
                    @Override
                    public void onProgress(FFmpegProgress progress) {
                        durationMillis.set(progress.getTimeMillis());
                    }
                })
                .execute();
        System.out.println("audio size - "+fFmpegResult.getAudioSize());
        System.out.println("Exact duration: " + durationMillis.get() + " milliseconds");
    }

    public void toRawAndPlay() throws Exception {
        ProgressListener listener = new ProgressListener() {
            @Override
            public void onProgress(FFmpegProgress progress) {
                System.out.println(progress.getFrame());
            }
        };

        // code derived from : https://stackoverflow.com/questions/32873596/play-raw-pcm-audio-received-in-udp-packets

        int sampleRate = 44100;//24000;//Hz
        int sampleSize = 16;//Bits
        int channels   = 1;
        boolean signed = true;
        boolean bigEnd = false;
        String format  = "s16be"; //"f32le"

        //https://trac.ffmpeg.org/wiki/audio types
        final AudioFormat af = new AudioFormat(sampleRate, sampleSize, channels, signed, bigEnd);
        final DataLine.Info info = new DataLine.Info(SourceDataLine.class, af);
        final SourceDataLine line = (SourceDataLine) AudioSystem.getLine(info);

        line.open(af, 4096); // format , buffer size
        line.start();

        OutputStream destination = new OutputStream() {
            @Override public void write(int b) throws IOException {
                throw new UnsupportedOperationException("Nobody uses thi.");
            }
            @Override public void write(byte[] b, int off, int len) throws IOException {
                String o = new String(b);
                boolean showString = false;
                System.out.println("New output ("+ len
                        + ", off="+off + ") -> "+(showString?o:"")); 
                // output wave form repeatedly

                if(len%2!=0) {
                    len -= 1;
                    System.out.println("");
                }
                line.write(b, off, len);
                System.out.println("done round");
            }
        };

        // src : http://blog.wudilabs.org/entry/c3d357ed/?lang=en-US
        FFmpegResult result = FFmpeg.atPath(BIN).
            addInput(UrlInput.fromPath(Paths.get(VIDEO_MP4))).
            addOutput(PipeOutput.pumpTo(destination).
                disableStream(StreamType.VIDEO). //.addArgument("-vn")
                setFrameRate(sampleRate).            //.addArguments("-ar", sampleRate)
                addArguments("-ac", "1").
                setFormat(format)              //.addArguments("-f", format)
            ).
            setProgressListener(listener).
            execute();

        // shut down audio
        line.drain();
        line.stop();
        line.close();

        System.out.println("result = "+result.toString());
    }

    public static void main(String[] args) throws Exception {
        FFMpegToRaw raw = new FFMpegToRaw();
        raw.basicCheck();
        raw.toRawAndPlay();
    }
}



    



    Thank You

    


  • How to configure and validate a Funnel in Piwik Analytics

    16 janvier 2017, par InnoCraft — Community

    In the last blog post we have covered how the conversion Funnel plugin enriches your Piwik experience. This post will focus on how to configure and validate your funnel in Piwik so you get the correct data when you view the funnel reports. When you set up a funnel, it is crucial to have it configured correctly as the funnel report will be only as good as its configuration. When we built this Funnel feature, we focused on making the configuration and validation real simple because it is so important to get it right.

    To recap quickly : A Funnel defines a series of steps that you expect your visitors to take on their way to converting a goal or a sale. Funnels, a premium feature for Piwik developed by InnoCraft, lets you define funnels so you can improve your websites and mobile apps based on this data. Learn more about Funnel.

    Configuring a funnel

    As you will notice Funnels integrates nicely into the Piwik Goals management. You can configure a funnel whenever you create or update a goal. You can access the Goals Management either via “Administration => Goals” or via the reporting menu “Goals => Manage”. Then click on either “Add a new goal” or select an existing goal to edit it. At the bottom of the goal form, you will see a new row letting you configure a funnel. As with all our premium features we focused on displaying lots of inline help and explain directly in the UI what a funnel is about, what the steps are in order to configure a funnel, how a funnel helps you and more. This lets you use the Funnel feature even if you have never created or analyzed a funnel before.

    Preparing your Funnel configuration

    Before starting to configure a Funnel we usually have a brainstorm session identifying the funnels on a website or app and the paths we expect users to take there. Once we have identified each step, we click through those identified pages in our website and we note the URLs for each page as the URLs will be needed when you configure a funnel.

    Setting up a Goal

    Once we have finished the planning phase it is time to log into Piwik. We start by either adding a new goal or selecting an existing goal. If you are unfamiliar with setting up goals, have a look at the Piwik Goals user guide. At the bottom of a goal form when you create or update a goal, you can configure your funnel. The UI will first explain you everything about Funnels, what they are, how they help you and which steps you need to take in order to configure it.

    Configuring Funnel steps

    We start by configuring the steps we have identified in the planning phase. Those are the steps we expect our users to take when they convert a goal or purchase something. Now we need to add a step for each page we expect users to take, each step consists of a name and a pattern.

    The name will be shown to you in the funnel reporting so think of a good name that describes each step best, for example “Product”, “Cart”, “Checkout” and “Order”.

    The pattern is needed to define when a visitor will enter this step. Here it comes in handy to have already notes for each URL from the planning phase. You can select lots of different patterns based on “URL Path”, “URL” and “URL parameter”. For example “URL starts with”, “Path ends with”, “URL contains”, “URL matches the regular expression”, and more. Most tools make this configuration unnecessarily hard because they only allow you to choose from one or two patterns (only complicated pattern like regular expressions) and they don’t let you validate whether the URL you have in mind actually matches the pattern. There are three ways to validate your step configurations.

    Funnel Configure Steps

    Validating funnel steps

    When we configure a funnel, we validate our steps in the following three ways.

    1. Via the help icon next to the step configuration

    When you click on the help icon, you will receive valuable tips about configuring steps, what “required” means and how to match popular pages. It will also show you a list of all URLs that were tracked in your Piwik in the past and match your specified pattern. For example say you specify a pattern “Path starts with /products”, then Piwik will list all URLs that were tracked in the past matching this pattern. This lets you validate whether your pattern actually matches the URLs you had in mind. It will also show you if the pattern doesn’t match any known URL which can indicate that your configuration may be wrong.

    Funnel Known URLs

    2. Via the URL validator

    Below the steps configuration you find a form field that lets you enter any URL.

    Funnel URL validation

    We recommend to enter each URL that you have noted before in the planning phase. Once you enter a URL, the configurations will be validated immediately and the result will be shown to you in the step configuration. When a step matches your specified URL, the background will become green, when a step does not match the URL, the background will be red.

    Funnel Step Validation

    If the URL does not match the expected step, simply change your step configuration and the steps will be re-validated as you change the configuration. This way you will see instantly as soon as you got the configuration right.

    What you don’t want is that either all of your steps don’t match (red background) or that several steps match a certain URL (green background). When several step match one URL, then one visitor might enter several funnel steps on just one page. This usually indicates a problem with the step configuration.

    3. Manual funnel validation

    After we have created or updated the goal (more about this soon), we always test a funnel configuration manually. This means we now open our website and click through the pages that we hand in mind and check afterwards whether the steps we took actually appear in the funnel report as expected. This is just another safety net to make sure your funnel configuration is right.

    It is really crucial to have a correct funnel configuration as otherwise the shown data in the funnel reports might not be as helpful. That’s why we focused so much on making the validation part real easy.

    Activating and saving the funnel

    Once you are happy with your configuration, it is time to activate your funnel. As soon as you activate your funnel, a report for this funnel will be generated and the links and reports for this funnel will be visible in the UI. If you are later no longer interested in the funnel, simply deactivate the funnel so it won’t appear in the reporting UI anymore.

    Save and activate funnel

    To save your funnel configuration simply click on either “Add goal” or “Update goal”. The funnel will be automatically saved whenever you update your goal.

    Goals Management

    The funnel plugin also enriches the list of goals in the Piwik goal management. At a glance you can see whether a funnel for a goal is configured and activated (green tick in the funnel column), whether a funnel is configured but not activated (grey tick in the funnel column) or whether no funnel is configured for a goal (no tick at all).

    Funnels in Manage Goals

    How to get Funnels and related features

    You can get Funnels on the Piwik Marketplace. If you want to learn more about Funnels you might be also interested in the Funnel User Guide and the Funnel FAQ.

    Similar to Funnels we also offer Users Flow which lets you visualize the flow of your users and visitors across several interactions.