Newest 'ffmpeg' Questions - Stack Overflow

http://stackoverflow.com/questions/tagged/ffmpeg

Les articles publiés sur le site

  • I have an audio data stream from ffmpeg, how can I play it in a browser ?

    9 novembre 2013, par Conor Patrick

    I've been able to successfully stream live audio from my mic to my node server. I would now like to stream that to all connected clients. I have been trying to do it with web sockets.

    I'm streaming the audio with this command

    ffmpeg -f alsa -i hw:0 -acodec mp2 -f mp3 -r 30 http://localhost:8086
    

    Node gets the buffer array and I write it to all connected clients like so with the 'ws' package

    // HTTP Server to accept incomming MP3 Stream (audio)
    var audioServer = require('http').createServer( function(request, response) {
    
           audioSocket.broadcast(data, {binary:true});
    
    }).listen(8086);
    
    var audioSocket = new (require('ws').Server)({port: 8088});
    audioSocket.broadcast = function(data, opts) {
    
        for( var i in this.clients ) {
            this.clients[i].send(data);
        }
    };
    

    Any idea of how I can play this data on a browser? I tried following this topic but the decodeAudioData() method fails.

    My client side code

    node={};
    var audio = new WebSocket('ws://localhost:8088/');
    audio.binaryType = "arraybuffer";
    var context = new webkitAudioContext();
    
    audio.onmessage = function(data){
        node.buf=data.data;
        node.sync=0;
        node.retry=0;
        decode(node);
    }
    
    function syncStream(node){ // should be done by api itself. and hopefully will.
        var buf8 = new Uint8Array(node.buf); 
        buf8.indexOf = Array.prototype.indexOf;
        var i=node.sync, b=buf8;
        while(1) {
            node.retry++;
            i=b.indexOf(0xFF,i); if(i==-1 || (b[i+1] & 0xE0 == 0xE0 )) break;
            i++;
        }
        if(i!=-1) {
            var tmp=node.buf.slice(i); //carefull there it returns copy
            delete(node.buf); node.buf=null;
            node.buf=tmp;
            node.sync=i;
            return true;
        }
        return false;
    }
    
    function decode(node) {
        context.decodeAudioData(node.buf,
        function(decoded){
            node.source  = context.createBufferSource();
            node.source.connect(context.destination);
            node.source.buffer=decoded; 
            node.source.noteOn(context.currentTime);
            console.log('IT WORKED!  DECODED', decoded);
        },
        function(){ // only on error attempt to sync on frame boundary
            //console.log('error');
            if(syncStream(node)) decode(node);
        });
    }
    
  • Re-creating/matching ffmpeg settings

    8 novembre 2013, par Pete Helgren

    I have an MP4 file that plays pretty much on every browser using either HTML5 or flash fallback (using mediaelement.js). I also have a series of additional video files that I would like to have "match" the one file that does play consistently but I haven't been able to match the ffmpeg settings so it produces a like file. I used ffprobe and got the following results on the file that plays successfully:

    ffprobe version N-53616-g7a2edcf Copyright (c) 2007-2013 the FFmpeg developers
    built on May 29 2013 01:21:08 with gcc 4.7.3 (GCC)
    configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-av
    isynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enab
    le-iconv --enable-libass --enable-libbluray --enable-libcaca --enable-libfreetyp
    e --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --ena
    ble-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-l
    ibopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libsp
    eex --enable-libtheora --enable-libtwolame --enable-libvo-aacenc --enable-libvo-
    amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --
    enable-libxvid --enable-zlib
     libavutil      52. 34.100 / 52. 34.100
     libavcodec     55. 12.102 / 55. 12.102
     libavformat    55.  7.100 / 55.  7.100
     libavdevice    55.  1.101 / 55.  1.101
     libavfilter     3. 72.100 /  3. 72.100
     libswscale      2.  3.100 /  2.  3.100
     libswresample   0. 17.102 /  0. 17.102
     libpostproc    52.  3.100 / 52.  3.100
    Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'MyFile.mp4':
     Metadata:
      major_brand     : M4V
      minor_version   : 1
      compatible_brands: M4V mp42isom
      creation_time   : 2013-05-29 16:08:29
    Duration: 00:01:58.10, start: 0.000000, bitrate: 1155 kb/s
     Stream #0:0(eng): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 854x480 [SAR 1:1 DAR 427:240], 995 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc
    Metadata:
      creation_time   : 2013-05-29 16:08:29
      handler_name    : Mainconcept MP4 Video Media Handler
    Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 157 kb/s
    Metadata:
      creation_time   : 2013-05-29 16:08:29
      handler_name    : Mainconcept MP4 Sound Media Handler
    

    Following a few guides I found online, I am using the following ffmpeg settings:

    ffmpeg -i {input file name} -y -acodec aac -ac 2 -strict experimental -ab 64k -s 320x240 -vcodec libx264 -pix_fmt yuv420p -preset slow -profile:v baseline -level 30 -maxrate 300k -bufsize 600k -b:v 300k -f mp4 -threads 0 -movflags +faststart {output file name}
    

    That command produces the following output:

    ffmpeg -i "testin.mp4" -y -acodec aac -ac 2 -strict experimental -ab 64k -s 320x240 -vcodec libx264 -pix_fmt yuv420p -preset slow-profile:v baseline -level 30 -maxrate 300k -bufsize 600k -b:v 300k -f mp4 -threads 0 -movflags +faststart testout.mp4
    
    ffmpeg version N-53616-g7a2edcf Copyright (c) 2000-2013 the FFmpeg developers  built on May 29 2013 01:21:08 with gcc 4.7.3 (GCC)  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libcaca --enable-libfreetype --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib
      libavutil      52. 34.100 / 52. 34.100
      libavcodec     55. 12.102 / 55. 12.102
      libavformat    55.  7.100 / 55.  7.100
      libavdevice    55.  1.101 / 55.  1.101
      libavfilter     3. 72.100 /  3. 72.100
      libswscale      2.  3.100 /  2.  3.100
      libswresample   0. 17.102 /  0. 17.102
      libpostproc    52.  3.100 / 52.  3.100
    Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'testin.mp4':
      Metadata:
        major_brand     : mp42
        minor_version   : 0
        compatible_brands: mp42mp41
        creation_time   : 2013-10-01 17:11:42
      Duration: 00:04:33.75, start: 0.000000, bitrate: 725 kb/s
        Stream #0:0(eng): Video: h264 (Baseline) (avc1 / 0x31637661), yuv420p, 320x240 [SAR 1:1 DAR 4:3], 596 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc
        Metadata:
          creation_time   : 2013-10-01 17:11:42
          handler_name    : ?Mainconcept Video Media Handler
        Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 125 kb/s
        Metadata:
          creation_time   : 2013-10-01 17:11:42
          handler_name    : #Mainconcept MP4 Sound Media Handler
    [libx264 @ 0000000000358160] using SAR=1/1
    [libx264 @ 0000000000358160] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2AVX
    [libx264 @ 0000000000358160] profile Constrained Baseline, level 3.0
    [libx264 @ 0000000000358160] 264 - core 133 r2334 a3ac64b - H.264/MPEG-4 AVC codec - Copyleft 2003-2013 - http://www.videolan.org/x264.html - options: cabac=0 ref=5 deblock=1:0:0 analyse=0x1:0x111 me=umh subme=8 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=0 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=50 rc=cbr mbtree=1 bitrate=300 ratetol=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 vbv_maxrate=300 vbv_bufsize=600 nal_hrd=none ip_ratio=1.40 aq=1:1.00
    
    Output #0, mp4, to 'testout.mp4':
      Metadata:
        major_brand     : mp42
        minor_version   : 0
        compatible_brands: mp42mp41
        encoder         : Lavf55.7.100
       Stream #0:0(eng): Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p, 320x240 [SAR 1:1 DAR 4:3], q=-1--1, 300 kb/s, 30k tbn, 29.97 tbc
        Metadata:
          creation_time   : 2013-10-01 17:11:42
          handler_name    : ?Mainconcept Video Media Handler
        Stream #0:1(eng): Audio: aac ([64][0][0][0] / 0x0040), 48000 Hz, stereo, fltp, 64 kb/s
        Metadata:
          creation_time   : 2013-10-01 17:11:42
          handler_name    : #Mainconcept MP4 Sound Media Handler
    Stream mapping:
      Stream #0:0 -> #0:0 (h264 -> libx264)
      Stream #0:1 -> #0:1 (aac -> aac)
    Press [q] to stop, [?] for help
    frame=  283 fps=0.0 q=21.0 size=     329kB time=00:00:09.30 bitrate= 289.9kbits/
    frame=  565 fps=564 q=20.0 size=     760kB time=00:00:18.64 bitrate= 333.7kbits/
    frame=  846 fps=564 q=21.0 size=    1179kB time=00:00:28.20 bitrate= 342.5kbits/
    frame= 1123 fps=561 q=22.0 size=    1603kB time=00:00:37.33 bitrate= 351.7kbits/
    frame= 1376 fps=550 q=25.0 size=    1986kB time=00:00:45.69 bitrate= 356.1kbits/
    frame= 1651 fps=550 q=22.0 size=    2377kB time=00:00:55.01 bitrate= 353.9kbits/
    frame= 1914 fps=546 q=24.0 size=    2776kB time=00:01:03.70 bitrate= 357.0kbits/
    frame= 2181 fps=545 q=24.0 size=    3163kB time=00:01:12.70 bitrate= 356.4kbits/
    frame= 2443 fps=543 q=24.0 size=    3566kB time=00:01:21.38 bitrate= 358.9kbits/
    frame= 2702 fps=540 q=24.0 size=    3939kB time=00:01:30.04 bitrate= 358.4kbits/
    frame= 2965 fps=539 q=24.0 size=    4338kB time=00:01:38.73 bitrate= 359.9kbits/
    frame= 3236 fps=539 q=23.0 size=    4731kB time=00:01:48.03 bitrate= 358.7kbits/
    frame= 3505 fps=539 q=24.0 size=    5130kB time=00:01:56.75 bitrate= 360.0kbits/
    frame= 3765 fps=537 q=26.0 size=    5521kB time=00:02:05.41 bitrate= 360.6kbits/
    frame= 4036 fps=538 q=24.0 size=    5905kB time=00:02:14.59 bitrate= 359.4kbits/
    frame= 4326 fps=540 q=24.0 size=    6343kB time=00:02:24.10 bitrate= 360.6kbits/
    frame= 4606 fps=542 q=27.0 size=    6783kB time=00:02:33.49 bitrate= 362.0kbits/
    frame= 4886 fps=543 q=24.0 size=    7168kB time=00:02:42.81 bitrate= 360.7kbits/
    frame= 5166 fps=544 q=27.0 size=    7616kB time=00:02:52.13 bitrate= 362.5kbits/
    frame= 5456 fps=545 q=24.0 size=    8020kB time=00:03:01.84 bitrate= 361.3kbits/
    frame= 5736 fps=546 q=27.0 size=    8458kB time=00:03:11.18 bitrate= 362.4kbits/
    frame= 6001 fps=545 q=30.0 size=    8849kB time=00:03:20.17 bitrate= 362.1kbits/
    frame= 6264 fps=544 q=27.0 size=    9233kB time=00:03:28.85 bitrate= 362.2kbits/
    frame= 6526 fps=544 q=26.0 size=    9611kB time=00:03:37.55 bitrate= 361.9kbits/
    frame= 6793 fps=543 q=26.0 size=   10006kB time=00:03:46.51 bitrate= 361.9kbits/
    frame= 7076 fps=544 q=24.0 size=   10410kB time=00:03:55.86 bitrate= 361.6kbits/
    frame= 7355 fps=544 q=25.0 size=   10835kB time=00:04:05.20 bitrate= 362.0kbits/
    frame= 7615 fps=543 q=27.0 size=   11236kB time=00:04:13.88 bitrate= 362.5kbits/
    frame= 7883 fps=543 q=25.0 size=   11625kB time=00:04:22.89 bitrate= 362.3kbits/
    frame= 8166 fps=544 q=21.0 size=   12040kB time=00:04:32.31 bitrate= 362.2kbits/
    Starting second pass: moving header on top of the file
    frame= 8203 fps=540 q=-1.0 Lsize=   12417kB time=00:04:33.74 bitrate= 371.6kbits/s
    video:10035kB audio:2150kB subtitle:0 global headers:0kB muxing overhead 1.901929%
    [libx264 @ 0000000000358160] frame I:41    Avg QP:14.13  size: 18349
    [libx264 @ 0000000000358160] frame P:8162  Avg QP:17.24  size:  1167
    [libx264 @ 0000000000358160] mb I  I16..4: 24.8%  0.0% 75.2%
    [libx264 @ 0000000000358160] mb P  I16..4:  0.4%  0.0%  0.3%  P16..4: 29.1%  6.4%  3.2%  0.0%  0.0%    skip:60.7%
    [libx264 @ 0000000000358160] coded y,uvDC,uvAC intra: 66.1% 74.1% 53.1% inter: 15.3% 20.2% 4.0%
    [libx264 @ 0000000000358160] i16 v,h,dc,p: 23% 21% 11% 45%
    [libx264 @ 0000000000358160] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 21% 25% 14%  6%  7% 7%  7%  6%  7%
    [libx264 @ 0000000000358160] i8c dc,h,v,p: 43% 28% 19% 10%
    [libx264 @ 0000000000358160] ref P L0: 78.4% 12.6%  4.9%  2.4%  1.7%
    [libx264 @ 0000000000358160] kb/s:300.33
    

    The one problem with the incantation above is that on iPad's and iPhones and some Android tablets all you hear is the audio with no video. But the file listed above (contents of the ffprobe) does not have that problem, it WILL play on an iPad, iPhone, Android tablet. I researched causes for "audio, no video" and the recommendations were all over the deck. But, the file listed in the ffprobe DOES play, so if I can match those settings described by the ffprobe for all of the other videos, they should play consistently as well. My challenge is to match the ffprobe settings using ffmpeg and there doesn't seem to be a 1 to 1 match between what I see in ffprobe and the corresponding settings in ffmpeg (a nice utility would be to have ffprobe output the ffmpeg settings that could be used to create a file of similar format).

    I walked through the ffprobe documentation but couldn't find anything that would produce a format that could be used as input to ffmpeg. Suggestions?

  • NSOperationQueue's threads just don't die

    8 novembre 2013, par u2Fan

    Sorry, it's a bit wordy, but I wanted to make sure I was clear! ;-)

    I have an iOS app that uses FFMPEG for streaming RTSP. I've multi-threaded FFMPEG using NSOperationQueue such that most its work, other than painting the image to the screen, of course, happens in background threads. Works great! ...except for the fact that threads the NSOperationQueue creates never die!

    I init the Queue in the class' init method with:

    self->opQ = [[NSOperationQueue alloc] init];
    [self->opQ setMaxConcurrentOperationCount:1];
    

    I add methods to the Queue using blocks:

    [self->opQ addOperationWithBlock:^{
            [self haveConnectedSuccessfullyOperation];
    }];
    

    Or

    [self->opQ addOperationWithBlock:^{
            if (SOME_CONDITION) {
                [self performSelectorOnMainThread:@selector(DO_SOME_CRAP) withObject:nil waitUntilDone:NO];
            }
        }];
    

    Later, when I need to tear down the RTSP stream, in addition to telling FFMPEG to shut down, I call:

    [self->opQ cancelAllOperations];
    

    Which does indeed stop the threads from doing any work , but never actually destroys them. Below, you'll see a screen shot of threads that are doing nothing at all. This is what my threads look like after starting/stoping FFMPEG several times.

    Bad threads

    I seem to remember reading in Apple's documentation that NSOperations and the threads they are run on are destroyed once they are done executing, unless otherwise referenced. This doesn't appear to be the case.

    Do I just need to destroy the NSOperationQueue, then re-init it when I need to start up FFMPEG again (I just realized I haven't tried this)? Anyone know how I need to kill these extra threads?

    THANKS!

  • How to convert flv video to mp3 using ffmpeg programatically ?

    8 novembre 2013, par user958353

    I need to create application on C++ for convertation, and I can't using ffmpeg.exe. I need to it programatically, but I don't know how can I do it, and I didn't find any examples in Internet. May be somebody know something about my task? Thank you.

  • Merge several mp4 video using ffmpeg and php [on hold]

    8 novembre 2013, par user2969041

    I would like to merge several videos using ffmpeg and php. I want to retrieve the names of the videos dynamically but I can't merge all the videos together I only get i-1 merged videos

    (I can't post the code, each time i would post it occures an error and then i can't post it)