Recherche avancée

Médias (1)

Mot : - Tags -/ogv

Autres articles (66)

  • Mise à jour de la version 0.1 vers 0.2

    24 juin 2013, par

    Explications des différents changements notables lors du passage de la version 0.1 de MediaSPIP à la version 0.3. Quelles sont les nouveautés
    Au niveau des dépendances logicielles Utilisation des dernières versions de FFMpeg (>= v1.2.1) ; Installation des dépendances pour Smush ; Installation de MediaInfo et FFprobe pour la récupération des métadonnées ; On n’utilise plus ffmpeg2theora ; On n’installe plus flvtool2 au profit de flvtool++ ; On n’installe plus ffmpeg-php qui n’est plus maintenu au (...)

  • Personnaliser en ajoutant son logo, sa bannière ou son image de fond

    5 septembre 2013, par

    Certains thèmes prennent en compte trois éléments de personnalisation : l’ajout d’un logo ; l’ajout d’une bannière l’ajout d’une image de fond ;

  • Ecrire une actualité

    21 juin 2013, par

    Présentez les changements dans votre MédiaSPIP ou les actualités de vos projets sur votre MédiaSPIP grâce à la rubrique actualités.
    Dans le thème par défaut spipeo de MédiaSPIP, les actualités sont affichées en bas de la page principale sous les éditoriaux.
    Vous pouvez personnaliser le formulaire de création d’une actualité.
    Formulaire de création d’une actualité Dans le cas d’un document de type actualité, les champs proposés par défaut sont : Date de publication ( personnaliser la date de publication ) (...)

Sur d’autres sites (12679)

  • Transcoding with the GCP Transcoder API results in a time gap

    3 mars 2021, par banyan

    I've been trying GCP's Transcoder API and having trouble with the time randomly becoming shorter than specified in certain cases.

    


    The specific cases are as follows :

    


      

    1. Specifying startTimeOffset and endTimeOffset (cut off 2 seconds before and after the video)
    2. 


    3. fMP4 is used as container
    4. 


    5. input video is mp4 with screen recording on iPad Pro
    6. 


    


    For example, if I don't specify startTimeOffset and endTimeOffset, the time will not be shortened. Also, there is no problem when MPEG2-TS is specified for container. There may be a problem with the video itself, but I haven't found a clue how to set it up.

    


    I'm not sure whether this is a problem with the Transcoder API or with me.

    


    The test input video : https://gofile.io/d/DUT9rr

    


    ❯ ffprobe input.mp4
ffprobe version 4.3.1 Copyright (c) 2007-2020 the FFmpeg developers
  built with Apple clang version 12.0.0 (clang-1200.0.32.28)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/4.3.1_8 --enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-libsoxr --enable-videotoolbox --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack
  libavutil      56. 51.100 / 56. 51.100
  libavcodec     58. 91.100 / 58. 91.100
  libavformat    58. 45.100 / 58. 45.100
  libavdevice    58. 10.100 / 58. 10.100
  libavfilter     7. 85.100 /  7. 85.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  7.100 /  5.  7.100
  libswresample   3.  7.100 /  3.  7.100
  libpostproc    55.  7.100 / 55.  7.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 1
    compatible_brands: isommp41mp42
    creation_time   : 2021-02-26T15:08:58.000000Z
  Duration: 00:02:51.15, start: 0.000000, bitrate: 551 kb/s
    Stream #0:0(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 246 kb/s (default)
    Metadata:
      creation_time   : 2021-02-26T15:08:58.000000Z
      handler_name    : Core Media Audio
    Stream #0:1(und): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc, bt709/bt709/iec61966-2-1), 1920x1342, 302 kb/s, 12.39 fps, 120 tbr, 600 tbn, 1200 tbc (default)
    Metadata:
      rotate          : 180
      creation_time   : 2021-02-26T15:08:58.000000Z
      handler_name    : Core Media Video
    Side data:
      displaymatrix: rotation of -180.00 degrees


    


    #!/bin/bash -eu

cat > request.json << EOF
{
  "config": {
    "inputs": [
      {
        key: "input0"
      }
    ],
    "editList": [
      {
        "key": "atom0",
        "inputs": [
          "input0"
        ],
        "startTimeOffset": "2s",
        "endTimeOffset": "169s",
      },
    ],
    "elementaryStreams": [
      {
        "videoStream": {
          "codec": "h265",
          "heightPixels": 480,
          "bitrateBps": 1200000,
          "rateControlMode": "vbr",
          "enableTwoPass": true,
          "frameRate": 30,
          "crfLevel": 31,
          "gopDuration": "3.0s",
        },
        "key": "h265-stream0"
      },
      {
        "videoStream": {
          "codec": "h265",
          "heightPixels": 720,
          "bitrateBps": 1550000,
          "rateControlMode": "vbr",
          "enableTwoPass": true,
          "frameRate": 30,
          "crfLevel": 31,
          "gopDuration": "3.0s",
        },
        "key": "h265-stream1"
      },
      {
        "videoStream": {
          "codec": "h265",
          "heightPixels": 1080,
          "bitrateBps": 2600000,
          "rateControlMode": "vbr",
          "enableTwoPass": true,
          "frameRate": 30,
          "crfLevel": 31,
          "gopDuration": "3.0s",
        },
        "key": "h265-stream2"
      },
      {
        "audioStream": {
          "codec": "aac",
          "bitrateBps": 64000,
          "channelCount": 2,
          "channelLayout": [
            "fl",
            "fr"
          ],
          "sampleRateHertz": 48000
        },
        "key": "audio-stream0"
      },
    ],
    "muxStreams": [
      {
        "key": "media-sd",
        "fileName": "media-sd.m4s",
        "container": "fmp4",
        "elementaryStreams": [
          "h265-stream0",
        ],
        "segmentSettings": {
          "individualSegments": true
        },
      },
      {
        "key": "media-hd",
        "fileName": "media-hd.m4s",
        "container": "fmp4",
        "elementaryStreams": [
          "h265-stream1",
        ],
        "segmentSettings": {
          "individualSegments": true
        },
      },
      {
        "key": "media-fhd",
        "fileName": "media-fhd.m4s",
        "container": "fmp4",
        "elementaryStreams": [
          "h265-stream2",
        ],
        "segmentSettings": {
          "individualSegments": true
        },
      },
      {
        "key": "audio-only",
        "fileName": "audio-only.m4s",
        "container": "fmp4",
        "elementaryStreams": [
          "audio-stream0"
        ],
        "segmentSettings": {
          "individualSegments": true
        },
      },
    ],
    "manifests": [
      {
        "fileName": "manifest-h265.mpd",
        "type": "DASH",
        "muxStreams": [
          "media-sd",
          "media-hd",
          "media-fhd",
          "audio-only",
        ]
      },
    ]
  }
}
EOF

curl -X POST \
-H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
https://transcoder.googleapis.com/v1beta1/projects/MY_PROJECT/locations/asia-east1/jobTemplates?jobTemplateId=test-template


    


    #!/bin/bash -eu

cat > request.json << EOF
{
  "inputUri": "gs://my-bucket/input.mp4",
  "outputUri": "gs://my-bucket/output/",
  "templateId": "test-template"
}
EOF

curl -X POST \
-H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
https://transcoder.googleapis.com/v1beta1/projects/MY_PROJECT/locations/asia-east1/jobs


    


    The following is a ffprobe of the resulting manifest file, which is 2 seconds shorter than specified. (expected : 00:02:47.00, actual : 00:02:45.00) In this case, it's a 2-second gap, but it can be 10 seconds or 30 seconds, and it varies from video to video.

    


    ❯ ffprobe manifest-h265.mpd
ffprobe version 4.3.1 Copyright (c) 2007-2020 the FFmpeg developers
  built with Apple clang version 12.0.0 (clang-1200.0.32.28)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/4.3.1_8 --enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-libsoxr --enable-videotoolbox --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack
  libavutil      56. 51.100 / 56. 51.100
  libavcodec     58. 91.100 / 58. 91.100
  libavformat    58. 45.100 / 58. 45.100
  libavdevice    58. 10.100 / 58. 10.100
  libavfilter     7. 85.100 /  7. 85.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  7.100 /  5.  7.100
  libswresample   3.  7.100 /  3.  7.100
  libpostproc    55.  7.100 / 55.  7.100
Input #0, dash, from 'manifest-h265.mpd':
  Duration: 00:02:45.00, start: 0.000000, bitrate: 0 kb/s
  Program 0
    Stream #0:0: Video: hevc (Main) (hvc1 / 0x31637668), yuv420p(tv, bt709/unknown/unknown), 686x480, 112 kb/s, 30 fps, 120 tbr, 10k tbn, 30 tbc
    Metadata:
      variant_bitrate : 113679
      id              : 113679
    Stream #0:1: Video: hevc (Main) (hvc1 / 0x31637668), yuv420p(tv, bt709/unknown/unknown), 1030x720, 205 kb/s, 30 fps, 120 tbr, 10k tbn, 30 tbc
    Metadata:
      variant_bitrate : 189219
      id              : 189219
    Stream #0:2: Video: hevc (Main) (hvc1 / 0x31637668), yuv420p(tv, bt709/unknown/unknown), 1544x1080, 384 kb/s, 30 fps, 120 tbr, 10k tbn, 30 tbc
    Metadata:
      variant_bitrate : 358043
      id              : 358043
    Stream #0:3: Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 65 kb/s
    Metadata:
      variant_bitrate : 70245
      id              : 70245


    


    The following is the time as specified for h264 + MPEG2-TS + Apple HLS.

    


    ❯ ffprobe manifest-h264.m3u8 | pbcopy
ffprobe version 4.3.1 Copyright (c) 2007-2020 the FFmpeg developers
  built with Apple clang version 12.0.0 (clang-1200.0.32.28)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/4.3.1_8 --enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-libsoxr --enable-videotoolbox --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack
  libavutil      56. 51.100 / 56. 51.100
  libavcodec     58. 91.100 / 58. 91.100
  libavformat    58. 45.100 / 58. 45.100
  libavdevice    58. 10.100 / 58. 10.100
  libavfilter     7. 85.100 /  7. 85.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  7.100 /  5.  7.100
  libswresample   3.  7.100 /  3.  7.100
  libpostproc    55.  7.100 / 55.  7.100
[hls @ 0x7fe23100f200] Opening 'h264-sd-ts.m3u8' for reading
[hls @ 0x7fe23100f200] Skip ('#EXT-X-VERSION:4')
[hls @ 0x7fe23100f200] Opening 'h264-hd-ts.m3u8' for reading
[hls @ 0x7fe23100f200] Skip ('#EXT-X-VERSION:4')
[hls @ 0x7fe23100f200] Opening 'h264-fhd-ts.m3u8' for reading
[hls @ 0x7fe23100f200] Skip ('#EXT-X-VERSION:4')
[hls @ 0x7fe23100f200] Opening 'h264-sd0000000000.ts' for reading
[hls @ 0x7fe23100f200] Opening 'h264-hd0000000000.ts' for reading
[hls @ 0x7fe23100f200] Opening 'h264-fhd0000000000.ts' for reading
Input #0, hls, from 'manifest-h264.m3u8':
  Duration: 00:02:47.00, start: 0.000000, bitrate: 0 kb/s
  Program 0
    Metadata:
      variant_bitrate : 511576
    Stream #0:0: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p, 686x480, 120 tbr, 90k tbn, 2000k tbc
    Metadata:
      variant_bitrate : 511576
    Stream #0:1: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp
    Metadata:
      variant_bitrate : 511576
  Program 1
    Metadata:
      variant_bitrate : 793711
    Stream #0:2: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p, 1030x720, 120 tbr, 90k tbn, 2000k tbc
    Metadata:
      variant_bitrate : 793711
    Stream #0:3: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp
    Metadata:
      variant_bitrate : 793711
  Program 2
    Metadata:
      variant_bitrate : 1305288
    Stream #0:4: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p, 1544x1080, 120 tbr, 90k tbn, 2000k tbc
    Metadata:
      variant_bitrate : 1305288
    Stream #0:5: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp
    Metadata:
      variant_bitrate : 1305288


    


  • Prevent ffmpeg from changing the intensity of colors while downscaling the resolution of the video

    29 août 2022, par dravit

    I have a use case where I need to downscale a 716x1280 mp4 video to 358x640 (half of the original). Command that I used is

    


    ffmpeg -i ./input.mp4 -vf "scale=640:640:force_original_aspect_ratio=decrease,pad=ceil(iw/2)*2:ceil(ih/2)*2" ./output.mp4


    


    Out of 10 sample videos, 2 of the them suffered impact on colors. Below I have attached a comparison from the one which was impacted the most.

    


    Comparison of frames from the most impacted video

    


    NOTE : The one on the right is a frame from the original video and the frame on the left is the one from the processed (down scaled) video. Notice the colors red and green in the image (even the skin color and hair color were changed).

    


    What I am looking for is

    


      

    • Is there any way I can prevent changes like these happening ? Probably some flag on saturation, brightness, contrast or any other parameter.
    • 


    • I am assuming that ffmpeg uses some default settings while downscaling a video. What made ffmpeg change colors only for these two videos ? If it made similar changes for the rest of the videos as well, how to predict this behaviour before hand ?
    • 


    


    EDIT :

    


    What I already have Tried ?

    


      

    • -crf with values 0 and 18.
    • 


    • -preset veryslow as mentioned here
    • 


    


    None helped

    


    Mediainfo input V/S output

    


    





    


    


    


    


    


    



    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    param input output
    color range Limited NA (attribute not in description)
    color primaries BT.2020 NA (attribute not in description)
    transfer characteristics HLG NA (attribute not in description)
    matrix coefficients BT.2020 non-constant NA (attribute not in description)
    bit deapth 8 8

    


    


    Logs of the ffmpeg command

    


    ffmpeg -i ./input.mp4 -vf "scale=640:640:force_original_aspect_ratio=decrease,pad=ceil(iw/2)*2:ceil(ih/2)*2" -movflags +faststart ./output.mp4
ffmpeg version 4.3.1 Copyright (c) 2000-2020 the FFmpeg developers
  built with Apple clang version 12.0.0 (clang-1200.0.32.28)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/4.3.1_9 --enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-libsoxr --enable-videotoolbox --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack
  libavutil      56. 51.100 / 56. 51.100
  libavcodec     58. 91.100 / 58. 91.100
  libavformat    58. 45.100 / 58. 45.100
  libavdevice    58. 10.100 / 58. 10.100
  libavfilter     7. 85.100 /  7. 85.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  7.100 /  5.  7.100
  libswresample   3.  7.100 /  3.  7.100
  libpostproc    55.  7.100 / 55.  7.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from './input.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.45.100
  Duration: 00:00:30.05, start: 0.000000, bitrate: 10366 kb/s
    Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt2020nc/bt2020/arib-std-b67), 716x1280, 10116 kb/s, 30 fps, 30 tbr, 19200 tbn, 38400 tbc (default)
    Metadata:
      handler_name    : Core Media Video
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 245 kb/s (default)
    Metadata:
      handler_name    : Core Media Audio
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
  Stream #0:1 -> #0:1 (aac (native) -> aac (native))
Press [q] to stop, [?] for help
[libx264 @ 0x7faab4808800] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
[libx264 @ 0x7faab4808800] profile High, level 3.0, 4:2:0, 8-bit
[libx264 @ 0x7faab4808800] 264 - core 161 r3027 4121277 - H.264/MPEG-4 AVC codec - Copyleft 2003-2020 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=12 lookahead_threads=2 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to './output.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.45.100
    Stream #0:0(und): Video: h264 (libx264) (avc1 / 0x31637661), yuv420p, 358x640, q=-1--1, 30 fps, 15360 tbn, 30 tbc (default)
    Metadata:
      handler_name    : Core Media Video
      encoder         : Lavc58.91.100 libx264
    Side data:
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : Core Media Audio
      encoder         : Lavc58.91.100 aac
[mp4 @ 0x7faab5808800] Starting second pass: moving the moov atom to the beginning of the file
frame=  901 fps=210 q=-1.0 Lsize=    3438kB time=00:00:30.02 bitrate= 938.0kbits/s speed=7.01x
video:2933kB audio:472kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.974633%
[libx264 @ 0x7faab4808800] frame I:6     Avg QP:22.60  size: 20769
[libx264 @ 0x7faab4808800] frame P:228   Avg QP:24.84  size:  7657
[libx264 @ 0x7faab4808800] frame B:667   Avg QP:27.59  size:  1697
[libx264 @ 0x7faab4808800] consecutive B-frames:  0.9%  0.9%  1.0% 97.2%
[libx264 @ 0x7faab4808800] mb I  I16..4:  9.5% 64.6% 26.0%
[libx264 @ 0x7faab4808800] mb P  I16..4:  2.5% 12.2%  2.5%  P16..4: 37.2% 20.6% 11.2%  0.0%  0.0%    skip:13.7%
[libx264 @ 0x7faab4808800] mb B  I16..4:  0.4%  2.1%  0.2%  B16..8: 42.2%  7.1%  1.2%  direct: 1.8%  skip:44.9%  L0:39.4% L1:52.8% BI: 7.8%
[libx264 @ 0x7faab4808800] 8x8 transform intra:72.2% inter:74.2%
[libx264 @ 0x7faab4808800] coded y,uvDC,uvAC intra: 61.8% 67.2% 20.2% inter: 16.7% 13.9% 1.3%
[libx264 @ 0x7faab4808800] i16 v,h,dc,p: 24% 19%  7% 50%
[libx264 @ 0x7faab4808800] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 21% 16% 15%  6%  9% 11%  7% 10%  6%
[libx264 @ 0x7faab4808800] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 25% 16% 13%  7%  9% 10%  7%  9%  4%
[libx264 @ 0x7faab4808800] i8c dc,h,v,p: 53% 16% 26%  5%
[libx264 @ 0x7faab4808800] Weighted P-Frames: Y:3.9% UV:1.8%
[libx264 @ 0x7faab4808800] ref P L0: 57.8% 19.5% 14.8%  7.8%  0.1%
[libx264 @ 0x7faab4808800] ref B L0: 90.7%  7.2%  2.1%
[libx264 @ 0x7faab4808800] ref B L1: 95.3%  4.7%
[libx264 @ 0x7faab4808800] kb/s:799.80
[aac @ 0x7faab2036a00] Qavg: 189.523


    


  • FFmpeg stream stops after a certain time

    7 avril 2021, par Anarno

    We have a little Nodejs app, which starts a stream process, with a child_process.spawn. On the client-side, we have an HTML5-canvas element, which records the video data new MediaRecorder(canvas.captureStream(30), config), then this client sends its data to our Nodejs server over a WebSocket connection. We using FFmpeg for video encoding and decoding, then we send the data to our 3-rd party service (MUX), which accepts the stream and broadcasts them. Sadly the process continuously loses its fps, and after in general 1 minute, stops with an interesting error code. (when we save the video result locally instead of streaming via rtmps, it works perfectly.

    


    *The whole system is in docker.

    


    The error :

    


     stderr: [tls @ 0x7f998e7bca40] Error in the pull function.&#xA;Our_app_logs:    | av_interleaved_write_frame(): I/O error    &#xA;Our_app_logs:    | [flv @ 0x7f998eeb1680] Failed to update header with correct duration.&#xA;Our_app_logs:    | [flv @ 0x7f998eeb1680] Failed to update header with correct filesize.&#xA;Our_app_logs:    | Error writing trailer of rtmps://global-live.mux.com/app/94e85197-78a3-f092-3437-03d93aba74e0: I/O error&#xA;Our_app_logs:    |  <buffer 5b="5b" 74="74" 6c="6c" 73="73" 20="20" 40="40" 30="30" 78="78" 37="37" 66="66" 39="39" 38="38" 65="65" 62="62" 63="63" 61="61" 34="34" 5d="5d" 45="45" 72="72" 6f="6f" 69="69" 6e="6e" 68="68" 70="70" 75="75" 2e="2e">&#xA;Our_app_logs:    | stderr: frame= 1478 fps= 25 q=23.0 Lsize=  &#xA;   402kB time=00:01:02.89 bitrate=  52.4kbits/s speed=1.05x&#xA;Our_app_logs:    | video:369kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 9.034639%&#xA;Our_app_logs:    |  <buffer 66="66" 72="72" 61="61" 6d="6d" 65="65" 3d="3d" 20="20" 31="31" 34="34" 37="37" 38="38" 70="70" 73="73" 32="32" 35="35" 71="71" 33="33" 2e="2e" 30="30" 4c="4c" 69="69" 7a="7a" 6b="6b" 42="42" 74="74">&#xA;Our_app_logs:    | stderr: [tls @ 0x7f998e7bca40]  <buffer 5b="5b" 6c="6c" 73="73" 20="20" 40="40" 30="30" 78="78" 37="37" 66="66" 39="39" 38="38" 65="65" 62="62" 63="63" 61="61" 34="34" 5d="5d">    &#xA;Our_app_logs:    | stderr: The specified session has been invalidated for some reason.&#xA;Our_app_logs:    |  <buffer 54="54" 68="68" 65="65" 20="20" 73="73" 70="70" 63="63" 69="69" 66="66" 64="64" 6f="6f" 6e="6e" 61="61" 62="62" 76="76" 6c="6c" 74="74" 72="72" 6d="6d">&#xA;Our_app_logs:    | stderr:     Last message repeated 1 times  &#xA;Our_app_logs:    |  <buffer 20="20" 4c="4c" 61="61" 73="73" 74="74" 6d="6d" 65="65" 67="67" 72="72" 70="70" 64="64" 31="31" 69="69" 0a="0a">  &#xA;Our_app_logs:    | stderr: [libx264 @ 0x7f998e790080]  <buffer 5b="5b" 6c="6c" 69="69" 62="62" 78="78" 32="32" 36="36" 34="34" 20="20" 40="40" 30="30" 37="37" 66="66" 39="39" 38="38" 65="65" 5d="5d">&#xA;Our_app_logs:    | stderr: frame I:13    Avg QP: 5.39  size:  &#xA;2478&#xA;Our_app_logs:    |  <buffer 66="66" 72="72" 61="61" 6d="6d" 65="65" 20="20" 49="49" 3a="3a" 31="31" 33="33" 41="41" 76="76" 67="67" 51="51" 50="50" 35="35" 2e="2e" 39="39" 73="73" 69="69" 7a="7a" 32="32" 34="34" 37="37" 38="38" 0a="0a">&#xA;Our_app_logs:    | stderr: [libx264 @ 0x7f998e790080]  <buffer 5b="5b" 6c="6c" 69="69" 62="62" 78="78" 32="32" 36="36" 34="34" 20="20" 40="40" 30="30" 37="37" 66="66" 39="39" 38="38" 65="65" 5d="5d">&#xA;Our_app_logs:    | stderr: frame P:1465  Avg QP:13.51  size:  &#xA; 235&#xA;Our_app_logs:    |  <buffer 66="66" 72="72" 61="61" 6d="6d" 65="65" 20="20" 50="50" 3a="3a" 31="31" 34="34" 36="36" 35="35" 41="41" 76="76" 67="67" 51="51" 33="33" 2e="2e" 73="73" 69="69" 7a="7a" 32="32" 0a="0a">&#xA;Our_app_logs:    | stderr: [libx264 @ 0x7f998e790080]  <buffer 5b="5b" 6c="6c" 69="69" 62="62" 78="78" 32="32" 36="36" 34="34" 20="20" 40="40" 30="30" 37="37" 66="66" 39="39" 38="38" 65="65" 5d="5d">&#xA;Our_app_logs:    | stderr: mb I  I16..4: 99.2%  0.1%  0.7%    &#xA;Our_app_logs:    |  <buffer 6d="6d" 62="62" 20="20" 49="49" 31="31" 36="36" 2e="2e" 34="34" 3a="3a" 39="39" 32="32" 25="25" 30="30" 37="37" 0a="0a">        &#xA;Our_app_logs:    | stderr: [libx264 @ 0x7f998e790080]  <buffer 5b="5b" 6c="6c" 69="69" 62="62" 78="78" 32="32" 36="36" 34="34" 20="20" 40="40" 30="30" 37="37" 66="66" 39="39" 38="38" 65="65" 5d="5d">&#xA;Our_app_logs:    | stderr: mb P  I16..4:  0.3%  0.0%  0.0%  P16..4:  0.1%  0.0%  0.0%  0.0%  0.0%    skip:99.6%&#xA;Our_app_logs:    |  <buffer 6d="6d" 62="62" 20="20" 50="50" 49="49" 31="31" 36="36" 2e="2e" 34="34" 3a="3a" 30="30" 33="33" 25="25">&#xA;Our_app_logs:    | stderr: [libx264 @ 0x7f998e790080]  <buffer 5b="5b" 6c="6c" 69="69" 62="62" 78="78" 32="32" 36="36" 34="34" 20="20" 40="40" 30="30" 37="37" 66="66" 39="39" 38="38" 65="65" 5d="5d">&#xA;Our_app_logs:    | stderr: 8x8 transform intra:0.3% inter:17.3%&#xA;Our_app_logs:    |  <buffer 38="38" 78="78" 20="20" 74="74" 72="72" 61="61" 6e="6e" 73="73" 66="66" 6f="6f" 6d="6d" 69="69" 3a="3a" 30="30" 2e="2e" 33="33" 25="25" 65="65" 31="31" 37="37" 0a="0a">&#xA;Our_app_logs:    | stderr: [libx264 @ 0x7f998e790080]  <buffer 5b="5b" 6c="6c" 69="69" 62="62" 78="78" 32="32" 36="36" 34="34" 20="20" 40="40" 30="30" 37="37" 66="66" 39="39" 38="38" 65="65" 5d="5d">&#xA;Our_app_logs:    | stderr: coded y,uvDC,uvAC intra: 1.4% 6.9% &#xA;4.7% inter: 0.0% 0.0% 0.0%&#xA;Our_app_logs:    |  <buffer 63="63" 6f="6f" 64="64" 65="65" 20="20" 79="79" 2c="2c" 75="75" 76="76" 44="44" 43="43" 41="41" 69="69" 6e="6e" 74="74" 72="72" 61="61" 3a="3a" 31="31" 2e="2e" 34="34" 25="25" 36="36" 39="39" 37="37" 30="30">&#xA;Our_app_logs:    | stderr: [libx264 @ 0x7f998e790080]  <buffer 5b="5b" 6c="6c" 69="69" 62="62" 78="78" 32="32" 36="36" 34="34" 20="20" 40="40" 30="30" 37="37" 66="66" 39="39" 38="38" 65="65" 5d="5d">&#xA;Our_app_logs:    | stderr: i16 v,h,dc,p: 90%  5%  5%  0%&#xA;Our_app_logs:    |  <buffer 69="69" 31="31" 36="36" 20="20" 76="76" 2c="2c" 68="68" 64="64" 63="63" 70="70" 3a="3a" 39="39" 30="30" 25="25" 35="35" 0a="0a">&#xA;Our_app_logs:    | stderr: [libx264 @ 0x7f998e790080]  <buffer 5b="5b" 6c="6c" 69="69" 62="62" 78="78" 32="32" 36="36" 34="34" 20="20" 40="40" 30="30" 37="37" 66="66" 39="39" 38="38" 65="65" 5d="5d">&#xA;Our_app_logs:    | stderr: i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 23% &#xA;18% 51%  6%  0%  0%  0%  0%  3%&#xA;Our_app_logs:    |  <buffer 69="69" 38="38" 20="20" 76="76" 2c="2c" 68="68" 64="64" 63="63" 6c="6c" 72="72" 75="75" 3a="3a" 32="32" 33="33" 25="25" 31="31" 35="35" 36="36" 30="30">&#xA;Our_app_logs:    | stderr: [libx264 @ 0x7f998e790080]  <buffer 5b="5b" 6c="6c" 69="69" 62="62" 78="78" 32="32" 36="36" 34="34" 20="20" 40="40" 30="30" 37="37" 66="66" 39="39" 38="38" 65="65" 5d="5d">&#xA;Our_app_logs:    | stderr: i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 33% &#xA;25% 40%  0%  0%  0%  0%  0%  0%&#xA;Our_app_logs:    |  <buffer 69="69" 34="34" 20="20" 76="76" 2c="2c" 68="68" 64="64" 63="63" 6c="6c" 72="72" 75="75" 3a="3a" 33="33" 25="25" 32="32" 35="35" 30="30">&#xA;Our_app_logs:    | stderr: [libx264 @ 0x7f998e790080]  <buffer 5b="5b" 6c="6c" 69="69" 62="62" 78="78" 32="32" 36="36" 34="34" 20="20" 40="40" 30="30" 37="37" 66="66" 39="39" 38="38" 65="65" 5d="5d">&#xA;Our_app_logs:    | stderr: i8c dc,h,v,p: 86%  7%  6%  0%&#xA;Our_app_logs:    |  <buffer 69="69" 38="38" 63="63" 20="20" 64="64" 2c="2c" 68="68" 76="76" 70="70" 3a="3a" 36="36" 25="25" 37="37" 30="30" 0a="0a">&#xA;Our_app_logs:    | stderr: [libx264 @ 0x7f998e790080]  <buffer 5b="5b" 6c="6c" 69="69" 62="62" 78="78" 32="32" 36="36" 34="34" 20="20" 40="40" 30="30" 37="37" 66="66" 39="39" 38="38" 65="65" 5d="5d">&#xA;Our_app_logs:    | stderr: Weighted P-Frames: Y:0.1% UV:0.1%  &#xA;Our_app_logs:    |  <buffer 57="57" 65="65" 69="69" 67="67" 68="68" 74="74" 64="64" 20="20" 50="50" 2d="2d" 46="46" 72="72" 61="61" 6d="6d" 73="73" 3a="3a" 59="59" 30="30" 2e="2e" 31="31" 25="25" 55="55" 56="56" 0a="0a">  &#xA;Our_app_logs:    | stderr: [libx264 @ 0x7f998e790080]  <buffer 5b="5b" 6c="6c" 69="69" 62="62" 78="78" 32="32" 36="36" 34="34" 20="20" 40="40" 30="30" 37="37" 66="66" 39="39" 38="38" 65="65" 5d="5d">&#xA;Our_app_logs:    | stderr: kb/s:2041.23&#xA;Our_app_logs:    |  <buffer 6b="6b" 62="62" 2f="2f" 73="73" 3a="3a" 32="32" 30="30" 34="34" 31="31" 2e="2e" 33="33" 0a="0a">&#xA;Our_app_logs:    | stderr: Conversion failed!&#xA;Our_app_logs:    |  <buffer 43="43" 6f="6f" 6e="6e" 76="76" 65="65" 72="72" 73="73" 69="69" 20="20" 66="66" 61="61" 6c="6c" 64="64" 21="21" 0a="0a">&#xA;Our_app_logs:    | close, code: 1, signal: null&#xA;Our_app_logs:    | from react application: 14203&#xA;Our_app_logs:    | Status ok...&#xA;Our_app_logs:    | Data ok...&#xA;Our_app_logs:    | FFmpeg ok...&#xA;Our_app_logs:    | Writeable ok... <buffer c4="c4" 81="81" 0e="0e" 11="11" 00="00" 01="01" 61="61" c7="c7" 80="80" 5b="5b" b6="b6" 72="72" 03="03" bc="bc" b7="b7" de="de" 59="59" 7f="7f" 3c="3c" 27="27" b3="b3" 87="87" b2="b2" e6="e6" 84="84" d0="d0" f0="f0" 02="02" 2d="2d" c0="c0" 08="08" 70="70"> undefined&#xA;Our_app_logs:    | stderr: ffmpeg version 4.2.4 Copyright (c) &#xA;2000-2020 the FFmpeg developers&#xA;Our_app_logs:    |   built with gcc 9.2.0 (Alpine 9.2.0)&#xA;Our_app_logs:    |   configuration: --prefix=/usr --enable-avresample --enable-avfilter --enable-gnutls --enable-gpl --enable-libass --enable-libmp3lame --enable-libvorbis --enable-libvpx --enable-libxvid --enable-libx264 --enable-libx265 --enable-libtheora --enable-libv4l2 --enable-postproc --enable-pic --enable-pthreads --enable-shared --enable-libxcb --disable-stripping --disable-static --disable-librtmp --enable-vaapi --enable-vdpau --enable-libopus --disable-debug&#xA;Our_app_logs:    |  <buffer 66="66" 6d="6d" 70="70" 65="65" 67="67" 20="20" 76="76" 72="72" 73="73" 69="69" 6f="6f" 6e="6e" 34="34" 2e="2e" 32="32" 43="43" 79="79" 68="68" 74="74" 28="28" 63="63" 29="29" 30="30" 2d="2d" 46="46">&#xA;Our_app_logs:    | stderr:   libavutil      56. 31.100 / 56. 31.100&#xA;Our_app_logs:    |   libavcodec     58. 54.100 / 58. 54.100   &#xA;Our_app_logs:    |   libavformat    58. 29.100 / 58. 29.100&#xA;Our_app_logs:    |   libavdevice    58.  8.100 / 58.  8.100&#xA;Our_app_logs:    |   libavfilter     7. 57.100 /  7. 57.100&#xA;Our_app_logs:    |   libavresample   4.  0.  0 /  4.  0.  0   &#xA;Our_app_logs:    |   libswscale      5.  5.100 /  5.  5.100   &#xA;Our_app_logs:    |   libswresample   3.  5.100 /  3.  5.100   &#xA;Our_app_logs:    |   libpostproc    55.  5.100 / 55.  5.100   &#xA;Our_app_logs:    |  <buffer 20="20" 6c="6c" 69="69" 62="62" 61="61" 76="76" 75="75" 74="74" 35="35" 36="36" 2e="2e" 33="33" 31="31" 30="30" 2f="2f" 0a="0a" 63="63" 6f="6f">&#xA;Our_app_logs:    | stderr: [h264 @ 0x7f299f44f600] non-existing PPS 14 referenced&#xA;Our_app_logs:    |     Last message repeated 4 times&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] decode_slice_header error&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] non-existing PPS 14 referenced&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] decode_slice_header error&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] no frame!&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] non-existing PPS 14 referenced&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] decode_slice_header error&#xA;Our_app_logs:    |  <buffer 5b="5b" 68="68" 32="32" 36="36" 34="34" 20="20" 40="40" 30="30" 78="78" 37="37" 66="66" 39="39" 5d="5d" 6e="6e" 6f="6f" 2d="2d" 65="65" 69="69" 73="73" 74="74" 67="67" 50="50" 53="53" 31="31" 72="72">&#xA;Our_app_logs:    | stderr: [h264 @ 0x7f299f44f600] non-existing PPS 14 referenced&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] decode_slice_header error&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] no frame!&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] non-existing PPS 14 referenced&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] decode_slice_header error&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] non-existing PPS 14 referenced&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] decode_slice_header error&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] no frame!&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] non-existing PPS 14 referenced&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] decode_slice_header error&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] non-existing PPS 14 referenced&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] decode_slice_header error&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] no frame!&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] non-existing PPS 14 referenced&#xA;Our_app_logs:    |     Last message repeated 5 times&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] decode_slice_header error&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] non-existing PPS 14 referenced&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] decode_slice_header error&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] no frame!&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] non-existing PPS 14 referenced&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] decode_slice_header error&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] non-existing PPS 14 referenced&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] decode_slice_header error&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] no frame!&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] non-existing PPS 14 referenced&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] decode_slice_headerOur_app_logs:    | [h264 @ 0x7f299f44f600] non-existing PPS 14 referenced&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] decode_slice_header error&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] no frame!&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] non-existing PPS 14 referenced&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] decode_slice_header error&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] non-existing PPS 14 referenced&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] decode_slice_header error&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] no frame!&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] non-existing PPS 14 referenced&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] decode_slice_header error&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] non-existing PPS 14 referenced&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] decode_slice_header error&#xA;Our_app_logs:    | [h264 @ 0x7f299f44f600] no frame!&#xA;&#xA;</buffer></buffer></buffer></buffer></buffer></buffer></buffer></buffer></buffer></buffer></buffer></buffer></buffer></buffer></buffer></buffer></buffer></buffer></buffer></buffer></buffer></buffer></buffer></buffer></buffer></buffer></buffer></buffer></buffer></buffer></buffer></buffer></buffer></buffer>

    &#xA;

    The FFmpeg config :

    &#xA;

    const FFMPEG_CONFIG = [&#xA;  &#x27;-i&#x27;,&#xA;  &#x27;-&#x27;,&#xA;&#xA;  // video codec config: low latency, adaptive bitrate&#xA;  //   &#x27;-vcodec&#x27;,&#xA;  //   &#x27;copy&#x27;,&#xA;  &#x27;-c:v&#x27;,&#xA;  &#x27;libx264&#x27;,&#xA;  &#x27;-preset&#x27;,&#xA;  &#x27;veryfast&#x27;,&#xA;  &#x27;-tune&#x27;,&#xA;  &#x27;zerolatency&#x27;,&#xA;&#xA;  // audio codec config: sampling frequency (11025, 22050, 44100), bitrate 64 kbits&#xA;  &#x27;-c:a&#x27;,&#xA;  &#x27;aac&#x27;,&#xA;  &#x27;-ar&#x27;,&#xA;  &#x27;44100&#x27;,&#xA;  &#x27;-b:a&#x27;,&#xA;  &#x27;64k&#x27;,&#xA;&#xA;  //force to overwrite&#xA;  &#x27;-y&#x27;,&#xA;&#xA;  // used for audio sync&#xA;  &#x27;-use_wallclock_as_timestamps&#x27;,&#xA;  &#x27;1&#x27;,&#xA;  &#x27;-async&#x27;,&#xA;  &#x27;1&#x27;,&#xA;&#xA;  //&#x27;-filter_complex&#x27;, &#x27;aresample=44100&#x27;, // resample audio to 44100Hz, needed if input is not 44100&#xA;  //&#x27;-strict&#x27;, &#x27;experimental&#x27;,&#xA;  &#x27;-bufsize&#x27;,&#xA;  &#x27;1000&#x27;,&#xA;  &#x27;-f&#x27;,&#xA;  &#x27;flv&#x27;,&#xA;];&#xA;

    &#xA;

    The process :

    &#xA;

    const process = child_process.spawn(&#x27;ffmpeg&#x27;, [&#xA;      ...FFMPEG_CONFIG,&#xA;      //   &#x27;local.bin&#x27;,&#xA;      url,&#xA;    ]);&#xA; &#xA;    process.stderr.on(&#x27;data&#x27;, data => {&#xA;      console.log(`stderr: ${data}`, data);&#xA;    });&#xA;&#xA;    process.stdin.on(&#x27;error&#x27;, e => {&#xA;      console.log(&#x27;FFmpeg STDIN Error&#x27;, e);&#xA;    });&#xA;&#xA;    process.on(&#x27;error&#x27;, err => console.log(err));&#xA;&#xA;    process.on(&#x27;close&#x27;, (code, signal) => {&#xA;      console.log(`close, code: ${code}, signal: ${signal}`);&#xA;    });&#xA;

    &#xA;

    The writing :

    &#xA;

    if (!Buffer.isBuffer(data)) return;&#xA;if (!process.stdin.writable) return;&#xA;process.stdin.write(data);&#xA;

    &#xA;