Recherche avancée

Médias (1)

Mot : - Tags -/belgique

Autres articles (66)

Sur d’autres sites (14161)

  • ffmpeg converted video from s3 bucket downloads before playing the video

    12 octobre 2020, par Rutu

    I making a video streaming application with react and node js.
I am converting video into different resolution with ffmpeg and storing directly to S3 bucket with the help of piping.

    


    I am streaming uploaded resolution video from S3 bucket directly through cloudfront in HTML5 tag with video.js

    


    When i tried to play original video through cloudfront in player its working fine, But as soon i play ffmpeg converted video to video player in cloudfront i am facing issue :

    


    Video takes a lot load (Downloads in browser) before playing in player.

    


    Below is my ffmpeg command

    


    await loadProcess( [&#xA;&#x27;i&#x27;,<s3 url="url" of="of" original="original" video="video">,&#xA;  &#x27;-movflags&#x27;,&#xA;  &#x27;frag_keyframe&#x2B;empty_moov&#x27;,&#x27;-vf&#x27;, &#x27;scale=-2:360&#x27;,&#x27;-c:v&#x27;,&#x27;h264&#x27;,&#x27;-profile:v&#x27;,&#x27;baseline&#x27;,&#x27;-r&#x27;,30,&#x27;-g&#x27;, 60,&#x27;-b:v&#x27;,&#x27;1M&#x27;,&#x27;-f&#x27;,&#x27;mp4&#x27;,&#x27;-&#x27;]&#xA;, outPath,&#x27;video/mp4&#x27;)&#xA;&#xA;</s3>

    &#xA;

    this is my loadProcess function : i am using aws cli to direct upload resolution video to S3 bucket :

    &#xA;

    export function loadProcess(ffmpegOptions, outPath,contentType) {&#xA;    return new Promise((resolve, reject) => {&#xA;        const  videoPath = outPath.replace(/\\/g, "/");&#xA;        let ffmpeg = spawn(conf.ffmpeg, ffmpegOptions);&#xA;        let awsPipe = spawn(&#x27;aws&#x27;, [&#x27;s3&#x27;, &#x27;cp&#x27;, &#x27;--content-type&#x27;, `${contentType}`, &#x27;-&#x27;, `s3://${process.env.AWS_S3_BUCKET}/${process.env.AWS_S3_VIDEOS_FOLDER}${videoPath}` ])&#xA;        ffmpeg.stdout.pipe(awsPipe.stdin)&#xA;&#xA;        // ffmpeg write stream flow&#xA;        let ffmpegData = &#x27;&#x27;&#xA;        ffmpeg.stderr.on(&#x27;data&#x27;, (_data) => {&#xA;            ffmpegData &#x2B;= _data.toString();&#xA;        })&#xA;        ffmpeg.on(&#x27;close&#x27;, (code) => {&#xA;            if (code === 0) {&#xA;                resolve(outPath)&#xA;            }&#xA;            else {&#xA;                let _dataSplit=ffmpegData.split(&#x27;\n&#x27;);&#xA;                _dataSplit.pop();&#xA;                console.log({action: &#x27;close&#x27;, message:_dataSplit.pop(), more:[conf.ffmpeg].concat(ffmpegOptions).join(&#x27; &#x27;)&#x2B;&#x27;\n&#x27;&#x2B;ffmpegData, code})&#xA;            }&#xA;        });&#xA;        ffmpeg.on(&#x27;error&#x27;, (err) => {&#xA;            reject({action: &#x27; ffmpeg error&#x27;, message: err});&#xA;        });&#xA;        &#xA;        // aws s3 cli read stream pipe flow&#xA;        let awsPipeData = &#x27;&#x27;&#xA;        awsPipe.stderr.on(&#x27;data&#x27;, _data => {&#xA;            awsPipeData &#x2B;= _data.toString()&#xA;        });&#xA;        awsPipe.on(&#x27;close&#x27;, (code) => {&#xA;            if (code === 0) {&#xA;                resolve(outPath)&#xA;            }else{&#xA;                console.log({action: &#x27;close&#x27;, message: awsPipeData})&#xA;            }&#xA;        });&#xA;        awsPipe.on(&#x27;error&#x27;, (err) => {&#xA;            reject({action: &#x27;awsPipe error&#x27;, message: err});&#xA;        })&#xA;&#xA;    })&#xA;}&#xA;

    &#xA;

    I have tried using +faststart option in ffmpeg but getting command failed error.&#xA;Can someone please help me this ?

    &#xA;

    Thanks in advance

    &#xA;

  • ffmpeg - compositing a video within a video in the centre

    1er mars 2017, par kieran

    I’m looking to composite a video with ffmpeg that places the video in the centre no matter what the composited video’s aspect ratio/size.

    The "background" video will always be 16:9 and 1920x1080px. I won’t know the aspect ratio or size of the overlay video as it will be user uploaded and could be any size/ratio.

    Here’s an example of what I’m trying to achieve :

    This is the background image :

    enter image description here

    Now I want to overlay a video over the top :

    enter image description here

    This should also work :enter image description here

    Essentially no matter what the dimensions I want to ensure it’s always resized to fit within 1920x1080 and in addition ensure it’s always centred.

    Finally, if the uploaded video is also 16:9 it should simply overlay the entire video :
    enter image description here

  • Express - FFMPEG : Serve transcoded video instead of static video file

    30 septembre 2020, par No stupid questions

    I am creating a website to host videos downloaded on my computer online. However, many of these videos are not in a web friendly format (like .mkv or .flv). It is not an option to convert these files on the disk and then serve them as static files, converting needs to be done live by the server. I want to transcode these videos with ffmpeg to a web friendly format like webm.

    &#xA;

    So far, I have been able to somewhat successfully transcode a video and serve it :

    &#xA;

    import express from &#x27;express&#x27;;&#xA;import cors from &#x27;cors&#x27;;&#xA;import ffmpeg from &#x27;fluent-ffmpeg&#x27;;&#xA;&#xA;const app = express();&#xA;&#xA;app.use(cors());&#xA;app.use(express.json());&#xA;&#xA;app.use(&#x27;/static/videos&#x27;, globalPasswordMiddleware, (req, res) => {&#xA;    res.contentType(&#x27;webm&#x27;);&#xA;    const videoPath = path.join(&#x27;C:/videos&#x27;, decodeURIComponent(req.path));&#xA;    ffmpeg(videoPath)&#xA;        .format(&#x27;webm&#x27;)&#xA;        .on(&#x27;end&#x27;, function () {&#xA;            console.log(&#x27;file has been converted succesfully&#x27;);&#xA;        })&#xA;        .on(&#x27;error&#x27;, function (err) {&#xA;            console.log(&#x27;an error happened: &#x27; &#x2B; err.message);&#xA;        })&#xA;        .pipe(res, { end: true });&#xA;});&#xA;

    &#xA;

    However, I am still encountering three different issues :

    &#xA;

    Firstly, while this code seems to work for transcoding something like a flash video into webm, there are still a number of videos I cannot get to play. For example, a number of videos that play in Chrome will still not play in Firefox or a number of videos that play on my PC won't on my ancient iPad. Are there more arguments I need to be passing to ffmpeg to transcode the video in a way that it will work on a greater number or devices/browsers ?

    &#xA;

    Second, there is no ability to seek on the video or see how much time remains. When viewing a transcoded video it behaves more like a livestream than if I were serving it as a static file. How can I fix this ?

    &#xA;

    And finally third, the transcoding is massively slow. Running in production mode, video playback has to buffer for a few seconds every five or so seconds. I am aware transcoding video is an intense process but I believe given my computer's hardware (i9 9900K) and how much faster it is at transcoding videos on Plex that I should be able to transcode videos faster than this.

    &#xA;