Newest 'ffmpeg' Questions - Stack Overflow

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

Les articles publiés sur le site

  • How to fix av_interleaved_write_frame() broken pipe error in php

    31 mars, par Adekunle Adeyeye

    I have an issue using ffmpeg to stream audio and parse to google cloud speech to text in PHP.

    It returns this output. I have tried delaying some part of the script, that did not solve it. I have also checked for similar questions. however, they are mostly in python and none of the solutions actually work for this.

      built with gcc 8 (GCC)
      cpudetect
      libavutil      56. 31.100 / 56. 31.100
      libavcodec     58. 54.100 / 58. 54.100
      libavformat    58. 29.100 / 58. 29.100
      libavdevice    58.  8.100 / 58.  8.100
      libavfilter     7. 57.100 /  7. 57.100
      libavresample   4.  0.  0 /  4.  0.  0
      libswscale      5.  5.100 /  5.  5.100
      libswresample   3.  5.100 /  3.  5.100
      libpostproc    55.  5.100 / 55.  5.100
    Input #0, mp3, from 'https://npr-ice.streamguys1.com/live.mp3':
      Metadata:
        icy-br          : 96
        icy-description : NPR Program Stream
        icy-genre       : News and Talk
        icy-name        : NPR Program Stream
        icy-pub         : 0
        StreamTitle     :
      Duration: N/A, start: 0.000000, bitrate: 96 kb/s
        Stream #0:0: Audio: mp3, 32000 Hz, stereo, fltp, 96 kb/s
    Stream mapping:
      Stream #0:0 -> #0:0 (mp3 (mp3float) -> pcm_s16le (native))
    Press [q] to stop, [?] for help
    Output #0, s16le, to 'pipe:':
      Metadata:
        icy-br          : 96
        icy-description : NPR Program Stream
        icy-genre       : News and Talk
        icy-name        : NPR Program Stream
        icy-pub         : 0
        StreamTitle     :
        encoder         : Lavf58.29.100
        Stream #0:0: Audio: pcm_s16le, 16000 Hz, mono, s16, 256 kb/s
        Metadata:
          encoder         : Lavc58.54.100 pcm_s16le
    **av_interleaved_write_frame(): Broken pipe** 256.0kbits/s speed=1.02x
    **Error writing trailer of pipe:: Broken pipe**
    size=      54kB time=00:00:01.76 bitrate= 250.8kbits/s speed=0.465x
    video:0kB audio:55kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
    Conversion failed!
    

    this is my PHP code

    require_once 'vendor/autoload.php';
        
        $projectId = "xxx-45512";
        putenv('GOOGLE_APPLICATION_CREDENTIALS=' . __DIR__ . '/xxx-45512-be3eb805f1d7.json');
        
        // Database connection
        $pdo = new PDO('mysql:host=localhost;dbname=', '', '');
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        
        $url = "https://npr-ice.streamguys1.com/live.mp3";
        
        $ffmpegCmd = "ffmpeg -re -i $url -acodec pcm_s16le -ac 1 -ar 16000 -f s16le -";
        
        $fp = popen($ffmpegCmd, "r");
        if (!$fp) {
            die("Failed to open FFmpeg stream.");
        }
        sleep(5);
    
        try {
            $client = new SpeechClient(['transport' => 'grpc', 'credentials' => json_decode(file_get_contents(getenv('GOOGLE_APPLICATION_CREDENTIALS')), true)]);
        } catch (Exception $e) {
            echo 'Error: ' . $e->getMessage(); 
            exit;
        }
        
        $recognitionConfig = new RecognitionConfig([
            'auto_decoding_config' => new AutoDetectDecodingConfig(),
            'language_codes' => ['en-US'],
            'model' => 'long',
        ]);
        
        $streamingConfig = new StreamingRecognitionConfig([
            'config' => $recognitionConfig,
        ]);
        
        $configRequest = new StreamingRecognizeRequest([
            'recognizer' => "projects/$projectId/locations/global/recognizers/_",
            'streaming_config' => $streamingConfig,
        ]);
        
        
        function streamAudio($fp)
        {
            while (!feof($fp)) {
                yield fread($fp, 4096);
            }
        }
        
        $responses = $client->streamingRecognize([
        'requests' => (function () use ($configRequest, $fp) {
                yield $configRequest; // Send initial config
                foreach (streamAudio($fp) as $audioChunk) {
                    yield new StreamingRecognizeRequest(['audio' => $audioChunk]);
                }
            })()]
        );
        
        // $responses = $speechClient->streamingRecognize();
        // $responses->writeAll([$request,]);
        
        foreach ($responses as $response) {
            foreach ($response->getResults() as $result) {
                $transcript = $result->getAlternatives()[0]->getTranscript();
                // echo "Transcript: $transcript\n";
        
                // Insert into the database
                $stmt = $pdo->prepare("INSERT INTO transcriptions (transcript) VALUES (:transcript)");
                $stmt->execute(['transcript' => $transcript]);
            }
        }
        
        
        pclose($fp);
        $client->close();
    

    I'm not sure what the issue is at this time.

    UPDATE

    I've done some more debugging and i have gotten the error to clear and to stream actually starts. However, I expect the audio to transcribe and update my database but instead I get this error when i close the stream

    error after closing stream

    this is my updated code

        $handle = popen($ffmpegCommand, "r");
    
        try {
            $client = new SpeechClient(['transport' => 'grpc', 'credentials' => json_decode(file_get_contents(getenv('GOOGLE_APPLICATION_CREDENTIALS')), true)]);
        } catch (Exception $e) {
            echo 'Error: ' . $e->getMessage(); 
            exit;
        }
        
        try {
        $recognitionConfig = (new RecognitionConfig())
            ->setAutoDecodingConfig(new AutoDetectDecodingConfig())
            ->setLanguageCodes(['en-US'], ['en-UK'])
            ->setModel('long');
        } catch (Exception $e) {
            echo 'Error: ' . $e->getMessage(); 
            exit;
        }
        
        try {
            $streamConfig = (new StreamingRecognitionConfig())
            ->setConfig($recognitionConfig);
        } catch (Exception $e) {
            echo 'Error: ' . $e->getMessage();
            exit;
        }
        try {
            $configRequest = (new StreamingRecognizeRequest())
            ->setRecognizer("projects/$projectId/locations/global/recognizers/_")
            ->setStreamingConfig($streamConfig);
        } catch (Exception $e) {
            echo 'Error: ' . $e->getMessage(); 
            exit;
        }
        
        $stream = $client->streamingRecognize();
        $stream->write($configRequest);
        
        mysqli_query($conn, "INSERT INTO transcriptions (transcript) VALUES ('bef')");
        
        while (!feof($handle)) {
            $chunk = fread($handle, 25600);
            // printf('chunk: ' . $chunk);
            if ($chunk !== false) {
                try {
                    $request = (new StreamingRecognizeRequest())
                            ->setAudio($chunk);
                        $stream->write($request);
                } catch (Exception $e) {
                    printf('Errorc: ' . $e->getMessage());
                }
            }
        }
        
        
        $insr = json_encode($stream);
        mysqli_query($conn, "INSERT INTO transcriptions (transcript) VALUES ('$insr')");
        
        foreach ($stream->read() as $response) {
            mysqli_query($conn, "INSERT INTO transcriptions (transcript) VALUES ('loop1')");
            foreach ($response->getResults() as $result) {
                mysqli_query($conn, "INSERT INTO transcriptions (transcript) VALUES ('loop2')");
                foreach ($result->getAlternatives() as $alternative) {
                    $trans = $alternative->getTranscript();
                    mysqli_query($conn, "INSERT INTO transcriptions (transcript) VALUES ('$trans')");
                }
            }
        }
        
        pclose($handle);
        $stream->close();
        $client->close();```
    
  • RTSP Frame Grabbing creates smeared , pixeled and corrupted images

    31 mars, par Robob

    I am trying to capture a single frame per second from a RTSP stream with following command ffmpeg -i rtsp://XXX -q:v 1 -vf fps=fps=1 -strftime 1 ZZZZ\%H_%M_%S.jpg

    But some of the frames are smeared ,pixeled and corrupted - this effect is drastically increases if rtsp resolution is increased Example 1 Example 2(if the resolution is decreased for example to 720P most of the frames are OK)

    I have to say that playing same rtsp stream in VLC or FFPLAY is flowless.

    How I can fix it to grab better quality

    Thanks in advance.

  • I have a problem with my input resampling FFmpeg audio code [closed]

    31 mars, par Jaime Samper

    I,ve tried to do a resampling with ffmpeg, but i found issues all the time in my code.

    firt, i tried to get the imput channel layout but av_channel_layout_default(&layout, audio_codecpar->nb_channels) tells me, "there´s not nb_channels menber.

    so i put the resampling code manually cause I know is stereo.

    av_opt_set_sample_fmt(swr_ctx, "in_sample_fmt", codec_ctx->sample_fmt, 0);
    av_opt_set_int(swr_ctx, "in_channel_layout", AV_CH_LAYOUT_STEREO, 0);
    av_opt_set_int(swr_ctx, "in_sample_rate", codec_ctx->sample_rate, 0);
    av_opt_set_sample_fmt(swr_ctx, "out_sample_fmt", AV_SAMPLE_FMT_S16, 0);
    av_opt_set_int(swr_ctx, "out_channel_layout", AV_CH_LAYOUT_STEREO, 0);
    av_opt_set_int(swr_ctx, "out_sample_rate", pwfx->nSamplesPerSec, 0);
    

    but on execution give me this error:

    Formato de mezcla: 48000 Hz, 32 bits, 2 canales
    [SWR @ 00000277ef707a40] Input channel layout "" is invalid or unsupported.
    

    any clue?

  • FFmpeg Non-monotonous DTS in output stream

    31 mars, par Tim Autin

    I need to record a h265 4K RTSP stream into 1/2h segments. I'm using this command:

    ffmpeg \
        -i "rtsp://..." \
        -vcodec copy \
        -segment_list /path/to/segments_2025-03-31_09-18-45.153_1.txt \
        -f segment -reset_timestamps 1 -segment_time 1800 -strftime 1 \
        "/path/to/segment_%y%m%d%H%M%S.mp4"
    

    It works but:

    • the recorded files show some artifact
    • these warnings are print in the console when starting recording:
    [segment @ 0x6171d02eeac0] Timestamps are unset in a packet for stream 0. This is deprecated and will stop working in the future. Fix your code to set the timestamps properly
    [segment @ 0x6171d02eeac0] Non-monotonous DTS in output stream 0:0; previous: 0, current: 0; changing to 1. This may result in incorrect timestamps in the output file.
    

    I tried adding -use_wallclock_as_timestamps 1 as well as -fflags +igndts but it doesn't change anything.

    What's wrong?

  • I Need Help Making Our Driver Station Video Feed Faster [closed]

    30 mars, par Joshua Green

    I am currently using FFmpeg on a Raspberry Pi 4 Model B using an ArduCam UC-844 Rev. B as the camera. We do not need any audio and I don't care about the quality of the video. All we need is for the stream to be as fast as possible. The video from the camera is being streamed to the driver station via FFmpeg and being picked up on the driver station via FFplay. Right now we are getting a delay that we wish could go away or be significantly shortened. These are the commands we are using.

    • Raspberry Pi: ffmpeg -i /dev/video0 -c:v libx264 -crf 45 -maxrate 1M -bufsize 1.2M -preset ultrafast -tune zerolatency -filter:v fps=30 -f mpegts -omit_video_pes_length 0 udp://10.2.33.5:554

    • Driver Station: ffplay -fflags nobuffer -flags low_delay -probesize 32 -analyzeduration 0 -f mpegts -vf setpts=0 udp://10.2.33.5:554