Recherche avancée

Médias (91)

Autres articles (3)

  • Submit bugs and patches

    13 avril 2011

    Unfortunately a software is never perfect.
    If you think you have found a bug, report it using our ticket system. Please to help us to fix it by providing the following information : the browser you are using, including the exact version as precise an explanation as possible of the problem if possible, the steps taken resulting in the problem a link to the site / page in question
    If you think you have solved the bug, fill in a ticket and attach to it a corrective patch.
    You may also (...)

  • Le plugin : Gestion de la mutualisation

    2 mars 2010, par

    Le plugin de Gestion de mutualisation permet de gérer les différents canaux de mediaspip depuis un site maître. Il a pour but de fournir une solution pure SPIP afin de remplacer cette ancienne solution.
    Installation basique
    On installe les fichiers de SPIP sur le serveur.
    On ajoute ensuite le plugin "mutualisation" à la racine du site comme décrit ici.
    On customise le fichier mes_options.php central comme on le souhaite. Voilà pour l’exemple celui de la plateforme mediaspip.net :
    < ?php (...)

  • MediaSPIP : Modification des droits de création d’objets et de publication définitive

    11 novembre 2010, par

    Par défaut, MediaSPIP permet de créer 5 types d’objets.
    Toujours par défaut les droits de création et de publication définitive de ces objets sont réservés aux administrateurs, mais ils sont bien entendu configurables par les webmestres.
    Ces droits sont ainsi bloqués pour plusieurs raisons : parce que le fait d’autoriser à publier doit être la volonté du webmestre pas de l’ensemble de la plateforme et donc ne pas être un choix par défaut ; parce qu’avoir un compte peut servir à autre choses également, (...)

Sur d’autres sites (796)

  • Playing and recording a live stream from another computer webcam using VLC/FFmpeg [closed]

    22 octobre 2012, par user573014

    I was trying lately to set a video server on one machine and play it in a differen machine, it works with me.. but the problem is that it always stuck and become jammed in the middle .. and it is very slow comparing to the original stream.. something like 5 seconds delay which is not acceptable at all !
    The warning messages I get usually includes something like that :
    in the client side, which is the one which is jammed

    [0x24d1ab0] ts demux warning: discontinuity received 0x5 instead of 0xe (pid=68)
    [0x7f4340015e50] rtp demux warning: 2 packet(s) lost
    reference picture missing during reorder
    Missing reference picture
    mmco: unref short failure
    Reference 4 >= 4 (H264 - MPEG-4 AVC (part 10)) stopped
    error while decoding MB 34 14, bytestream (575)

    and that is the picture of the streaming when it is jammed

    jammed stream

    and that is what it looks like when it is running smoothly

    smooth stream

    This is the error message I got on the server

    [0x2513820] main generic debug: auto hidding mouse
    [0x2296230] main mux warning: late buffer for mux input (1840085)

    and Finally here is my command line that I am using >
    on the server :

    vlc -vvv v4l2:///dev/video1:v4l2-width=640:v4l2-height=480 --sout
    &#39;#duplicate{dst=display,dst="transcode{vcodec=h264,vb=800,ab=128}
    :duplicate{dst=rtp{mux=ts,dst=172.22.2.87,port=50004}&#39;

    on the client :

    vlc -vvv rtp://@:50004

    I thought that it might be from VLC or from my command .. I tried different protocol for transmission, with no luck I also tried FFmpeg and I got similar results + warning messages .. I thought then that both of them are using the same libraries in Linux

    here is the command using FFMpeg :

    ffmpeg -f video4linux2 -i /dev/video1 -vcodec libx264 -s 320x240 -pix_fmt
    yuv420p -vb 200000 -minrate 200000 -maxrate 200000 -bufsize 2000000 -acodec
    libmp3lame -ab 128k -ar 44100 -ac 2 -f mpegts udp://172.22.2.87:5544

    In conclusion, I would like to find a solution for the latency of the streaming (which is very high) and the jamming problem
    I appreciate anyone's input, thank you

  • Ffmpeg error with output file not specified on linux when executing from dockerized new process in .net-core

    29 août 2017, par DutchGuy

    Some time back i created a small program in full .net framework that could rip mp3 and then add meta-info and a thumbnail to it. For innovation sake i started porting the application to .net core. After that i thought it would be cool to run this in docker on Linux. It took some time but i got it working. Now i’m running into the issue where i can rip the mp3 from the video file but when i try to combine the meta-info, thumbnail and mp3 ffmpeg tells me "At least one output file must be specified"

    I added some checks so the program can run on Linux and Windows (to switch paths etc)

    What i tried :

    • running same argument structure on windows (works)
    • Manualy starting the encode on linux (works)
    • Simplifying the names, paths and titles used in the command
    • replacing extra spaces and special characters, only "-" and single spaces allowed

    Below i have an example of the command that does work when i execute it manually but produces the earlier mentioned error when my program executes it. Also keep in mind that ripping the mp3 from the video does result in the desired outputfile.

    ffmpeg -i "temp/vid-id.mp3" -i "temp/vid-id.jpg" -map 0:0 -map 1:0 -c copy -y -id3v2_version 3 -metadata title="title" -metadata artist="artist" -metadata album="album" "completed/file - name.mp3"

    To start this from .net-core context i use the snippet below :

    using (var ffmpegProcess = new Process())
    {
     ffmpegProcess.EnableRaisingEvents = false;
     ffmpegProcess.StartInfo.CreateNoWindow = true;
     ffmpegProcess.StartInfo.UseShellExecute = false;
     ffmpegProcess.StartInfo.FileName = ffmpegPath(); (returns "/bin/bash")

     string command = "ffmpeg " + arguments;

     ffmpegProcess.StartInfo.Arguments = "-c \" " + command + " \"";

     ffmpegProcess.Start();
     ffmpegProcess.WaitForExit();
     ffmpegProcess.Dispose();
    }

    arguments :

    String.Format("-i \"{0}\" -i \"{1}.jpg\" -map 0:0 -map 1:0 -c copy -y -id3v2_version 3 -metadata title=\"{2}\" -metadata artist=\"{3}\" -metadata album=\"{4}\" \"{5}\"",inputFile, albumArtFile, outputTitle, artist, outputAlbum, outputFile);

    To rip the mp3 from the video file i use the same method mentioned above with the following arguments :

    -i "temp/vid-id.mp4" -vn -ab 320k -y -threads 2 "temp/vid-id.mp3"

    This works as expected.
    Arguments :

    String.Format("-i \"{0}\" -vn -ab 320k -y -threads 2 \"{1}\"", inputFile, outputFile);

    Vid-id does not contain spaces, below is and example of how it could look :

    "abcd12ef-gh34i"

    Since the initial ripping is working i cant figure out why Ffmpeg complains about the second operation. The only real difference between the two operations is that in the second one the output-file name can contain spaces. But even then, running the same command manually does work and produces the desired file in the completed dir.

    Update
    After more troubleshooting i have now narrowed the problem down to the usage of the metadata arguments. Still can’t figure out why

    Update
    The problem is with the spaces in the naming i have chosen. On linux the spaces are interpreted as end of file name. Any pointer how i can still use the naming with spaces ?

  • How to set crontab in order to run multiple python and a shell scripts ?

    5 janvier 2021, par Alexander Mitsou

    I need to start three python3 scripts and a shell script using crontab. These scripts should run at the same time without any delay. Each script runs exactly for one minute. For instance I have scheduled crontab to run these scripts every 5 minutes.

    &#xA;

    My problem is that, if I attempt to run each script individually from terminal it executes with no further errors, but using crontab nothing happens.

    &#xA;

    DISCLAIMER : If I set up the Python3 scripts individually in crontab, they work fine !

    &#xA;

    Here's my crontab set up :

    &#xA;

    */5 * * * * cd /home/user/Desktop/ &amp;&amp; /usr/bin/python3 script1.py >> report1.log&#xA;&#xA;*/5 * * * * cd /home/user/Desktop/ &amp;&amp; /usr/bin/python3 script2.py >> report2.log&#xA;&#xA;*/5 * * * * cd /home/user/Desktop/ &amp;&amp; /usr/bin/python3 script3.py >> report3.log&#xA;&#xA;*/5 * * * * cd /home/user/Desktop/ &amp;&amp; /usr/bin/sh script4.sh >> report4.log &#xA;

    &#xA;

    In addition I need to mention that the shell script contains this command (FFMPEG) :

    &#xA;

    #!/bin/bash&#xA;&#xA;parent_dir=`dirname \`pwd\`` &#xA;folder_name="/Data/Webcam" &#xA;new_path=$parent_dir$folder_name  &#xA;&#xA;&#xA;if [ -d "$new_path" ]; then&#xA;    echo "video_audio folder exists..."&#xA;else&#xA;    echo "Creating video_audio folder in the current directory..."&#xA;    mkdir -p -- "$new_path"&#xA;    sudo chmod 777 "$new_path"&#xA;    echo "Folder created"&#xA;    echo&#xA;fi&#xA;&#xA;now=$(date &#x2B;%F) &#xA;now="$( echo -e "$now" | tr  &#x27;-&#x27; &#x27;_&#x27;  )"&#xA;sub_dir=$new_path&#x27;/&#x27;$now &#xA;&#xA;if [ -d "$sub_dir" ]; then&#xA;    echo "Date Sub-directory exists..."&#xA;    echo&#xA;else&#xA;    echo "Error: ${sub_dir} not found..."&#xA;    echo "Creating date sub-directory..."&#xA;    mkdir -p -- "$sub_dir"&#xA;    sudo chmod 777 "$sub_dir"&#xA;    echo "Date sub-directory created..."&#xA;    echo&#xA;fi&#xA;&#xA;fname=$(date &#x2B;%H_%M_%S)".avi"&#xA;video_dir=$sub_dir&#x27;/&#x27;$fname&#xA;ffmpeg -f pulse -ac 1 -i default -f v4l2 -i  /dev/video0 -vcodec libx264 -t 00:01:00 $video_dir &#xA;

    &#xA;

    The log file of that script contain the following :

    &#xA;

    video_audio folder exists...&#xA;Date Sub-directory exists...&#xA;&#xA;Package ffmpeg is already installed...&#xA;Package v4l-utils is already installed...&#xA;&#xA;Package: ffmpeg&#xA;Status: install ok installed&#xA;Priority: optional&#xA;Section: video&#xA;Installed-Size: 2010&#xA;Maintainer: Ubuntu Developers &lt;ubuntu-devel-discuss@lists.ubuntu.com&gt;&#xA;Architecture: amd64&#xA;Multi-Arch: foreign&#xA;Version: 7:4.2.4-1ubuntu0.1&#xA;Replaces: libav-tools (&lt;&lt; 6:12~~), qt-faststart (&lt;&lt; 7:2.7.1-3~)&#xA;Depends: libavcodec58 (= 7:4.2.4-1ubuntu0.1), libavdevice58 (= 7:4.2.4-1ubuntu0.1), libavfilter7 (= 7:4.2.4-1ubuntu0.1), libavformat58 (= 7:4.2.4-1ubuntu0.1), libavresample4 (= 7:4.2.4-1ubuntu0.1), libavutil56 (= 7:4.2.4-1ubuntu0.1), libc6 (>= 2.29), libpostproc55 (= 7:4.2.4-1ubuntu0.1), libsdl2-2.0-0 (>= 2.0.10), libswresample3 (= 7:4.2.4-1ubuntu0.1), libswscale5 (= 7:4.2.4-1ubuntu0.1)&#xA;Suggests: ffmpeg-doc&#xA;Breaks: libav-tools (&lt;&lt; 6:12~~), qt-faststart (&lt;&lt; 7:2.7.1-3~), winff (&lt;&lt; 1.5.5-5~)&#xA;Description: Tools for transcoding, streaming and playing of multimedia files&#xA; FFmpeg is the leading multimedia framework, able to decode, encode, transcode,&#xA; mux, demux, stream, filter and play pretty much anything that humans and&#xA; machines have created. It supports the most obscure ancient formats up to the&#xA; cutting edge.&#xA; .&#xA; This package contains:&#xA;  * ffmpeg: a command line tool to convert multimedia files between formats&#xA;  * ffplay: a simple media player based on SDL and the FFmpeg libraries&#xA;  * ffprobe: a simple multimedia stream analyzer&#xA;  * qt-faststart: a utility to rearrange Quicktime files&#xA;Homepage: https://ffmpeg.org/&#xA;Original-Maintainer: Debian Multimedia Maintainers &lt;debian-multimedia@lists.debian.org&gt;&#xA;Package: v4l-utils&#xA;Status: install ok installed&#xA;Priority: optional&#xA;Section: utils&#xA;Installed-Size: 2104&#xA;Maintainer: Ubuntu Developers &lt;ubuntu-devel-discuss@lists.ubuntu.com&gt;&#xA;Architecture: amd64&#xA;Version: 1.18.0-2build1&#xA;Replaces: ivtv-utils (&lt;&lt; 1.4.1-2), media-ctl&#xA;Depends: libv4l-0 (= 1.18.0-2build1), libv4l2rds0 (= 1.18.0-2build1), libc6 (>= 2.17), libgcc-s1 (>= 3.0), libstdc&#x2B;&#x2B;6 (>= 5.2), libudev1 (>= 183)&#xA;Breaks: ivtv-utils (&lt;&lt; 1.4.1-2), media-ctl&#xA;Description: Collection of command line video4linux utilities&#xA; v4l-utils contains the following video4linux command line utilities:&#xA; .&#xA;  decode_tm6000: decodes tm6000 proprietary format streams&#xA;  rds-ctl: tool to receive and decode Radio Data System (RDS) streams&#xA;  v4l2-compliance: tool to test v4l2 API compliance of drivers&#xA;  v4l2-ctl, cx18-ctl, ivtv-ctl: tools to control v4l2 controls from the cmdline&#xA;  v4l2-dbg: tool to directly get and set registers of v4l2 devices&#xA;  v4l2-sysfs-path: sysfs helper tool&#xA;Original-Maintainer: Gregor Jasny &lt;gjasny@googlemail.com&gt;&#xA;Homepage: https://linuxtv.org/downloads/v4l-utils/&#xA;

    &#xA;

    Due to the reason that the python files are of the same structure I'm uploading a sample file here :

    &#xA;

    # -*- coding: utf-8 -*-&#xA;from threading import Timer&#xA;from pynput.mouse import Listener&#xA;import logging&#xA;import sys&#xA;import os&#xA;sys.path.insert(0, os.path.join(os.path.dirname(&#xA;    os.path.realpath(__file__)), "../"))&#xA;&#xA;from Functions import utils as ut&#xA;&#xA;if __name__==&#x27;__main__&#x27;:&#xA;&#xA;    ut.initialize_dirs()&#xA;    rec_file = &#x27;&#x27;.join((&#x27;mouse_&#x27;,ut.get_date(),&#x27;.txt&#x27;))&#xA;    raw_data = ut.get_name(&#x27;Mouse&#x27;)&#xA;    rec_file = os.path.join(raw_data,rec_file)&#xA;    logging.basicConfig(filename=rec_file,level=logging.DEBUG,format="%(asctime)s    %(message)s")&#xA;&#xA;    try:&#xA;        with Listener(on_move=ut.on_move, on_click=ut.on_click,on_scroll=ut.on_scroll) as listener:&#xA;            Timer(60, listener.stop).start()&#xA;            listener.join()&#xA;    except KeyboardInterrupt as err:&#xA;        print(err)&#xA;        sys.exit(0)&#xA;&#xA;    print(&#x27;Exiting logger...&#x27;)&#xA;&#xA;

    &#xA;

    I'm also uploading the functions that I use :

    &#xA;

    # -*- coding: utf-8 -*-&#xA;from serial import Serial&#xA;from datetime import datetime, timedelta&#xA;import pandas as pd&#xA;import collections&#xA;import logging&#xA;import shutil&#xA;import serial&#xA;import time&#xA;import sys&#xA;import os&#xA;&#xA;click_held = False&#xA;button = None&#xA;&#xA;&#xA;def on_move(x,y):&#xA;    """The callback to call when mouse move events occur&#xA;&#xA;    Args:&#xA;        x (float): The new pointer position&#xA;        y (float): The new pointer poisition&#xA;    """&#xA;    if click_held:&#xA;        logging.info("MV    {0:>8}  {1:>8}  {2:>8}:".format(x,y,str(None)))&#xA;    else:&#xA;        logging.info("MV    {0:>8}  {1:>8}  {2:>8}:".format(x,y,str(None)))&#xA;&#xA;&#xA;def on_click(x,y,button,pressed):&#xA;    """The callback to call when a mouse button is clicked&#xA;&#xA;    Args:&#xA;        x (float): Mouse coordinates on screen&#xA;        y (float): Mouse coordinates on screen&#xA;        button (str): one of the Button values&#xA;        pressed (bool): Pressed is whether the button was pressed&#xA;    """&#xA;    global click_held&#xA;    if pressed:&#xA;        click_held = True&#xA;        logging.info("CLK    {0:>7}    {1:>6}    {2:>13}".format(x,y,button))&#xA;    else:&#xA;        click_held = False&#xA;        logging.info("RLS    {0:>7}    {1:>6}    {2:>13}".format(x,y,button))&#xA;&#xA;&#xA;def on_scroll(x,y,dx,dy):&#xA;    """The callback to call when mouse scroll events occur&#xA;&#xA;    Args:&#xA;        x (float): The new pointer position on screen&#xA;        y (float): The new pointer position on screen&#xA;        dx (int): The horizontal scroll. The units of scrolling is undefined&#xA;        dy (int): The vertical scroll. The units of scrolling is undefined&#xA;    """&#xA;    if dy == -1:&#xA;        logging.info("SCRD    {0:>6}    {1:>6}    {2:>6}".format(x,y,str(None)))&#xA;    elif dy == 1:&#xA;        logging.info("SCRU    {0:>6}    {1:>6}    {2:>6}".format(x,y,str(None)))&#xA;    else:&#xA;        pass&#xA;&#xA;&#xA;def on_press_keys(key):&#xA;    """The callback to call when a button is pressed.&#xA;&#xA;    Args:&#xA;        key (str): A KeyCode,a Key or None if the key is unknown&#xA;    """&#xA;    subkeys = [&#xA;    &#x27;Key.alt&#x27;,&#x27;Key.alt_gr&#x27;,&#x27;Key.alt_r&#x27;,&#x27;Key.backspace&#x27;,&#xA;    &#x27;Key.space&#x27;,&#x27;Key.ctrl&#x27;,&#x27;Key.ctrl_r&#x27;,&#x27;Key.down&#x27;,&#xA;    &#x27;Key.up&#x27;,&#x27;Key.left&#x27;,&#x27;Key.right&#x27;,&#x27;Key.page_down&#x27;,&#xA;    &#x27;Key.page_up&#x27;,&#x27;Key.enter&#x27;,&#x27;Key.shift&#x27;,&#x27;Key.shift_r&#x27;&#xA;    ]&#xA;&#xA;    key = str(key).strip(&#x27;\&#x27;&#x27;)&#xA;    if(key in subkeys):&#xA;        #print(key)&#xA;        logging.info(key)&#xA;    else:&#xA;        pass&#xA;&#xA;&#xA;def record_chair(output_file):&#xA;    """Read the data stream coming from the serial monitor&#xA;       in order to get the sensor readings&#xA;&#xA;    Args:&#xA;        output_file (str): The file name, where the data stream will be stored&#xA;    """&#xA;    serial_port = "/dev/ttyACM0"&#xA;    baud_rate = 9600&#xA;    ser = serial.Serial(serial_port,baud_rate)&#xA;    logging.basicConfig(filename=output_file,level=logging.DEBUG,format="%(asctime)s    %(message)s")&#xA;    flag = False&#xA;    start = time.time()&#xA;    while time.time() - start &lt; 60.0:&#xA;        try:&#xA;            serial_data = str(ser.readline().decode().strip(&#x27;\r\n&#x27;))&#xA;            time.sleep(0.2)&#xA;            tmp = serial_data.split(&#x27;  &#x27;)[0] #Getting Sensor Id&#xA;            if(tmp == &#x27;A0&#x27;):&#xA;                flag = True&#xA;            if (flag and tmp != &#x27;A4&#x27;):&#xA;                #print(serial_data)&#xA;                logging.info(serial_data)&#xA;            if(flag and tmp == &#x27;A4&#x27;):&#xA;                flag = False&#xA;                #print(serial_data)&#xA;                logging.info(serial_data)&#xA;        except (UnicodeDecodeError, KeyboardInterrupt) as err:&#xA;            print(err)&#xA;            print(err.args)&#xA;            sys.exit(0)&#xA;&#xA;&#xA;def initialize_dirs():&#xA;    """Create the appropriate directories in order to save&#xA;       and process the collected data&#xA;    """&#xA;    current_path = os.path.abspath(os.getcwd())&#xA;    os.chdir(&#x27;..&#x27;)&#xA;    current_path = (os.path.abspath(os.curdir)) #/Multodal_User_Monitoring&#xA;    current_path = os.path.join(current_path,&#x27;Data&#x27;)&#xA;    create_subdirs([current_path])&#xA;&#xA;    #Create mouse log folder&#xA;    mouse = os.path.join(current_path,&#x27;Mouse&#x27;)&#xA;    create_subdirs([mouse])&#xA;    #Create mouse subfolders&#xA;    names = concat_names(mouse)&#xA;    create_subdirs(names)&#xA;&#xA;    #Create keyboard log  folder&#xA;    keyboard = os.path.join(current_path,&#x27;Keyboard&#x27;)&#xA;    create_subdirs([keyboard])&#xA;    #Create keyboard subfolders&#xA;    names = concat_names(keyboard)&#xA;    create_subdirs(names)&#xA;&#xA;    #Create the chair log folder&#xA;    chair = os.path.join(current_path,&#x27;Chair&#x27;)&#xA;    create_subdirs([chair])&#xA;    #Create chair subfolders&#xA;    names = concat_names(chair)&#xA;    create_subdirs(names)&#xA;&#xA;    #Create webcam log folder&#xA;    webcam = os.path.join(current_path,&#x27;Webcam&#x27;)&#xA;    create_subdirs([webcam])&#xA;&#xA;def concat_names(dir) -> str:&#xA;    """Concatenate the given folder names&#xA;       with the appropriate path&#xA;&#xA;    Args:&#xA;        dir (str): The directory to create the subfolders&#xA;&#xA;    Returns:&#xA;        list: The new absolute paths&#xA;    """&#xA;    raw_data = os.path.join(dir,&#x27;Raw&#x27;)&#xA;    edited_data = os.path.join(dir,&#x27;Edited_logs&#x27;)&#xA;    csv_data = os.path.join(dir,&#x27;CSV&#x27;)&#xA;    features = os.path.join(dir,&#x27;Features&#x27;)&#xA;    dirs = [raw_data,edited_data,csv_data,features]&#xA;    return dirs&#xA;&#xA;&#xA;def create_subdirs(paths):&#xA;    """Create sub directories given some absolute paths&#xA;&#xA;    Args:&#xA;        paths (list): A list containing the paths to be created&#xA;    """&#xA;    for index,path in enumerate(paths):&#xA;        if(os.path.isdir(paths[index])):&#xA;            pass&#xA;        else:&#xA;            os.mkdir(paths[index])&#xA;&#xA;&#xA;def round_down(num,divisor) -> int:&#xA;    """Round the number of lines contained into the recording file,&#xA;       down to the nearest multiple of the given divisor&#xA;&#xA;    Args:&#xA;        num (int): The number of lines contained into the given log file&#xA;        divisor (int): The divisor in order to get tuples of divisor&#xA;&#xA;    Returns:&#xA;        int: The nearest multiple of five&#xA;    """&#xA;    return num-(num%divisor)&#xA;&#xA;&#xA;def get_date() -> str:&#xA;    """Get the current date in order to properly name&#xA;       the recored log files&#xA;    Returns:&#xA;        str: The current date in: YY_MM_DD format&#xA;    """&#xA;    return datetime.now().strftime(&#x27;%Y_%m_%d&#x27;)&#xA;&#xA;&#xA;def get_name(modality) -> str:&#xA;    """Save the recorded log into /Data//Raw&#xA;&#xA;    Args:&#xA;        modality (str): The log data source&#xA;&#xA;    Returns:&#xA;        str: The absolute path where each recording is saved&#xA;    """&#xA;    current_path = os.path.abspath(os.getcwd())&#xA;    current_path = os.path.join(current_path,&#x27;Data&#x27;)&#xA;&#xA;    if modality == &#x27;Chair&#x27;:&#xA;        chair_path = os.path.join(current_path,modality,&#x27;Raw&#x27;)&#xA;        return chair_path&#xA;&#xA;    elif modality == &#x27;Mouse&#x27;:&#xA;        mouse_path = os.path.join(current_path,modality,&#x27;Raw&#x27;)&#xA;        return mouse_path&#xA;&#xA;    elif modality == &#x27;Keyboard&#x27;:&#xA;        keyboard_path = os.path.join(current_path,modality,&#x27;Raw&#x27;)&#xA;        return keyboard_path&#xA;&#xA;&#xA;def crawl_dir(target,folder) -> str:&#xA;    """Enumerate all the given files in a directory&#xA;       based on the given file extension&#xA;&#xA;    Args:&#xA;        target (str): The file to search for&#xA;        folder (str): The folder to search&#xA;&#xA;    Returns:&#xA;        [type]: A list containing the file names&#xA;    """&#xA;    current_path = os.path.abspath(os.getcwd())&#xA;    path = os.path.join(current_path,folder)&#xA;    file_names =[]&#xA;    for f in os.listdir(path):&#xA;        if(f.endswith(target)):&#xA;            fname=os.path.join(path,f)&#xA;            file_names.append(fname)&#xA;    return file_names&#xA;&#xA;&#xA;def convert_keys2_csv(input_file,output_file):&#xA;    """Convert the data stream file(keylogger recording) from .txt to .csv format&#xA;&#xA;    Args:&#xA;        input_file (str): The data stream file in .txt format&#xA;        output_file (str): The csv extension file name&#xA;    """&#xA;    df = pd.read_fwf(input_file)&#xA;    col_names = [&#x27;Date&#x27;,&#x27;Time&#x27;,&#x27;Key&#x27;]&#xA;    df.to_csv(output_file,header=col_names,encoding=&#x27;utf-8&#x27;,index=False)&#xA;&#xA;&#xA;def convert_mouse2_csv(input_file,output_file):&#xA;    """Convert the data stream file(mouselogger recording) from .txt to .csv format&#xA;&#xA;    Args:&#xA;        input_file (str): The data stream file in .txt format&#xA;        output_file (str): The csv extension file name&#xA;    """&#xA;    df = pd.read_fwf(input_file)&#xA;    col_names = [&#x27;Date&#x27;,&#x27;Time&#x27;,&#x27;Action&#x27;,&#x27;PosX&#x27;,&#x27;PosY&#x27;,&#x27;Button&#x27;]&#xA;    df.to_csv(output_file,header=col_names,encoding=&#x27;utf-8&#x27;,index=False)&#xA;&#xA;&#xA;def convert_chair_2_csv(input_file,output_file):&#xA;    """Convert the data stream file(chair recording)&#xA;       from .txt to .csv format&#xA;&#xA;    Args:&#xA;        input_file (str): The data stream file in .txt format&#xA;        output_file (str): The csv extension file name&#xA;    """&#xA;    if(os.path.isfile(input_file)):&#xA;        pass&#xA;    else:&#xA;        print(&#x27;Invalid working directory...&#x27;)&#xA;        print(&#x27;Aborting...&#x27;)&#xA;        sys.exit(0)&#xA;&#xA;    tmp0,tmp1,tmp2,tmp3,tmp4 = 0,1,2,3,4&#xA;&#xA;    line_number = 0&#xA;    for line in open(input_file).readlines():&#xA;        line_number &#x2B;= 1&#xA;&#xA;    rounded_line = round_down(line_number,5)&#xA;    d = collections.defaultdict(list)&#xA;&#xA;    with open(input_file,&#x27;r&#x27;) as f1:&#xA;        lines = f1.readlines()&#xA;        for i in range(rounded_line // 5):&#xA;            #Sensor:Analog input 0 values&#xA;            Sid0 = lines[i&#x2B;tmp0]&#xA;            temp = Sid0.split()&#xA;            d[&#x27;Sid0&#x27;].append([temp[0],temp[1],temp[2],temp[3]])&#xA;            #Sensor:Analog input 1 values&#xA;            Sid1 = lines[i&#x2B;tmp1]&#xA;            temp = Sid1.split()&#xA;            d[&#x27;Sid1&#x27;].append([temp[0],temp[1],temp[2],temp[3]])&#xA;            #Sensor:Analog input 2 values&#xA;            Sid2 = lines[i&#x2B;tmp2]&#xA;            temp = Sid2.split()&#xA;            d[&#x27;Sid2&#x27;].append([temp[0],temp[1],temp[2],temp[3]])&#xA;            #Sensor:Analog input 3 values&#xA;            Sid3 = lines[i&#x2B;tmp3]&#xA;            temp = Sid3.split()&#xA;            d[&#x27;Sid3&#x27;].append([temp[0],temp[1],temp[2],temp[3]])&#xA;            #Sensor:Analog input 4 values&#xA;            Sid4 = lines[i&#x2B;tmp4]&#xA;            temp = Sid4.split()&#xA;            d[&#x27;Sid4&#x27;].append([temp[0],temp[1],temp[2],temp[3]])&#xA;&#xA;            tmp0 &#x2B;= 4&#xA;            tmp1 &#x2B;= 4&#xA;            tmp2 &#x2B;= 4&#xA;            tmp3 &#x2B;= 4&#xA;            tmp4 &#x2B;= 4&#xA;&#xA;    l = []&#xA;    for i in range(rounded_line // 5):&#xA;        date = d[&#x27;Sid0&#x27;][i][0]&#xA;        time = d[&#x27;Sid0&#x27;][i][1]&#xA;        A0_val = d[&#x27;Sid0&#x27;][i][3]&#xA;        A1_val = d[&#x27;Sid1&#x27;][i][3]&#xA;        A2_val = d[&#x27;Sid2&#x27;][i][3]&#xA;        A3_val = d[&#x27;Sid3&#x27;][i][3]&#xA;        A4_val = d[&#x27;Sid4&#x27;][i][3]&#xA;        l.append([date,time,A0_val,A1_val,A2_val,A3_val,A4_val])&#xA;&#xA;    sensor_readings_df = pd.DataFrame.from_records(l)&#xA;    sensor_readings_df.columns = [&#x27;Date&#x27;,&#x27;Time&#x27;,&#x27;A0&#x27;,&#x27;A1&#x27;,&#x27;A2&#x27;,&#x27;A3&#x27;,&#x27;A4&#x27;]&#xA;    sensor_readings_df.to_csv(output_file, encoding=&#x27;utf-8&#x27;, index=False)&#xA;    del l&#xA;&#xA;&#xA;def parse_raw_data(modality):&#xA;    """Convert each modality&#x27;s raw data into csv format and move&#xA;       the edited raw data into the appropriate Edited_logs folder&#xA;&#xA;    Args:&#xA;        modality (str): The data source&#xA;    """&#xA;    #Change directories&#xA;    current_path = os.path.abspath(os.getcwd()) #/Functions&#xA;    os.chdir(&#x27;..&#x27;)&#xA;    current_path = (os.path.abspath(os.curdir)) #/Multimodal_User_Monitoring&#xA;    os.chdir(&#x27;./Data&#x27;)#/Multimodal_User_Monitoring/Data&#xA;    current_path = (os.path.abspath(os.curdir)) #/Multimodal_User_Monitoring/Data&#xA;    current_path = os.path.join(current_path,modality) #example: /Multimodal_User_Monitoring/Data/<modality>&#xA;    raw_data_path = os.path.join(current_path,&#x27;Raw&#x27;)&#xA;    csv_data_path = os.path.join(current_path,&#x27;CSV&#x27;)&#xA;    edited_logs_path = os.path.join(current_path,&#x27;Edited_logs&#x27;)&#xA;&#xA;    txt_names = crawl_dir(&#x27;.txt&#x27;,raw_data_path)&#xA;    csv_names = []&#xA;    for elem in txt_names:&#xA;        name = elem.split(&#x27;/&#x27;)[-1].split(&#x27;.&#x27;)[0]&#xA;        csv_name = name&#x2B;&#x27;.csv&#x27;&#xA;        tmp = os.path.join(csv_data_path,csv_name)&#xA;        csv_names.append(tmp)&#xA;&#xA;    if modality == &#x27;Mouse&#x27;:&#xA;        if len(txt_names) == len(csv_names):&#xA;            for i, elem in enumerate(txt_names):&#xA;            #for i in range(len(txt_names)):&#xA;                convert_mouse2_csv(txt_names[i],csv_names[i])&#xA;                shutil.move(txt_names[i],edited_logs_path)&#xA;&#xA;    elif modality == &#x27;Keyboard&#x27;:&#xA;        if len(txt_names) == len(csv_names):&#xA;            for i, elem in enumerate(txt_names):&#xA;            #for i in range(len(txt_names)):&#xA;                convert_keys2_csv(txt_names[i],csv_names[i])&#xA;                shutil.move(txt_names[i],edited_logs_path)&#xA;&#xA;    elif modality == &#x27;Chair&#x27;:&#xA;        if len(txt_names) == len(csv_names):&#xA;            for i, elem in enumerate(txt_names):&#xA;            #for i in range(len(txt_names)):&#xA;                convert_chair_2_csv(txt_names[i],csv_names[i])&#xA;                shutil.move(txt_names[i],edited_logs_path)&#xA;&#xA;</modality>

    &#xA;

    I need to mention that the logs of the python3 scripts are empty

    &#xA;