Error read format to my program.

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Error read format to my program.

ABDALLAH Moussa
Hello,

I don't know if it's the good place to ask that but I have a problem with my program. It's a program to try to save a stream video from an ip camera to a file. When I try to execute my program this is the error that's returns on the console :

[root@localhost Téléchargements]# ./my_streamer
[ingenient @ 0xbeec60] Could not find codec parameters for stream 0 (Video: mjpeg, none(bt470bg/unknown/unknown)): unspecified size
Consider increasing the value for the 'analyzeduration' and 'probesize' options
[root@localhost Téléchargements]#

Is there a way to force the program to read a mjpeg video if it don't find it ?

When I write the command line bellow everythings works fine :

[root@localhost Téléchargements]# ffmpeg -i http://192.9.200.121/ipcam/mjpeg.cgi -y -map 0 -t 5 -c copy -f matroska  _capture.mkv
ffmpeg version N-48170-gc8bc9d1380-static https://johnvansickle.com/ffmpeg/  Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 6.3.0 (Debian 6.3.0-18+deb9u1) 20170516
  configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev=sndio --disable-outdev=sndio --cc=gcc-6 --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gmp --enable-gray --enable-libaom --enable-libfribidi --enable-libass --enable-libvmaf --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librubberband --enable-libsoxr --enable-libspeex --enable-libvorbis --enable-libopus --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libdav1d --enable-libxvid --enable-libzvbi --enable-libzimg
  libavutil      56. 26.100 / 56. 26.100
  libavcodec     58. 47.102 / 58. 47.102
  libavformat    58. 26.101 / 58. 26.101
  libavdevice    58.  6.101 / 58.  6.101
  libavfilter     7. 48.100 /  7. 48.100
  libswscale      5.  4.100 /  5.  4.100
  libswresample   3.  4.100 /  3.  4.100
  libpostproc    55.  4.100 / 55.  4.100
Input #0, mpjpeg, from 'http://192.9.200.121/ipcam/mjpeg.cgi':
  Duration: N/A, bitrate: N/A
    Stream #0:0: Video: mjpeg (Baseline), yuvj420p(pc, bt470bg/unknown/unknown), 1920x1080 [SAR 1:1 DAR 16:9], 25 tbr, 25 tbn, 25 tbc
Output #0, matroska, to '_capture.mkv':
  Metadata:
    encoder         : Lavf58.26.101
    Stream #0:0: Video: mjpeg (Baseline) (MJPG / 0x47504A4D), yuvj420p(pc, bt470bg/unknown/unknown), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 25 tbr, 1k tbn, 25 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
Press [q] to stop, [?] for help
frame=  125 fps= 23 q=-1.0 Lsize=   16528kB time=00:00:04.96 bitrate=27292.4kbits/s speed=0.914x
video:16521kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.039828%
[root@localhost Téléchargements]#

Thanks a lot for your help !

This is my source (I take it on the web it is only to test to save a stream video to a file like I said before):

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <sstream>

extern "C" {
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavformat/avio.h>
#include <libswscale/swscale.h>
}

int main(int argc, char** argv) {

    // Open the initial context variables that are needed
    SwsContext *img_convert_ctx;
    AVFormatContext* format_ctx = avformat_alloc_context();
    AVCodecContext* codec_ctx = NULL;
    int video_stream_index;

    // Register everything
    av_register_all();
    avformat_network_init();

    //open RTSP
    if (avformat_open_input(&format_ctx, "http://192.9.200.121/ipcam/mjpeg.cgi",
            NULL, NULL) != 0) {
        return EXIT_FAILURE;
    }

    if (avformat_find_stream_info(format_ctx, NULL) < 0) {
        return EXIT_FAILURE;
    }

    //search video stream
    for (int i = 0; i < format_ctx->nb_streams; i++) {
        if (format_ctx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO)
            video_stream_index = i;
    }

    AVPacket packet;
    av_init_packet(&packet);

    //open output file
    AVFormatContext* output_ctx = avformat_alloc_context();

    AVStream* stream = NULL;
    int cnt = 0;

    //start reading packets from stream and write them to file
    av_read_play(format_ctx);    //play RTSP

    // Get the codec
    AVCodec *codec = NULL;
    codec = avcodec_find_decoder(AV_CODEC_ID_H264);
    if (!codec) {
        exit(1);
    }

    // Add this to allocate the context by codec
    codec_ctx = avcodec_alloc_context3(codec);

    avcodec_get_context_defaults3(codec_ctx, codec);
    avcodec_copy_context(codec_ctx, format_ctx->streams[video_stream_index]->codec);
    std::ofstream output_file;

    if (avcodec_open2(codec_ctx, codec, NULL) < 0)
        exit(1);

    img_convert_ctx = sws_getContext(codec_ctx->width, codec_ctx->height,
            codec_ctx->pix_fmt, codec_ctx->width, codec_ctx->height, AV_PIX_FMT_RGB24,
            SWS_BICUBIC, NULL, NULL, NULL);

    int size = avpicture_get_size(AV_PIX_FMT_YUV420P, codec_ctx->width,
            codec_ctx->height);
    uint8_t* picture_buffer = (uint8_t*) (av_malloc(size));
    AVFrame* picture = av_frame_alloc();
    AVFrame* picture_rgb = av_frame_alloc();
    int size2 = avpicture_get_size(AV_PIX_FMT_RGB24, codec_ctx->width,
            codec_ctx->height);
    uint8_t* picture_buffer_2 = (uint8_t*) (av_malloc(size2));
    avpicture_fill((AVPicture *) picture, picture_buffer, AV_PIX_FMT_YUV420P,
            codec_ctx->width, codec_ctx->height);
    avpicture_fill((AVPicture *) picture_rgb, picture_buffer_2, AV_PIX_FMT_RGB24,
            codec_ctx->width, codec_ctx->height);

    while (av_read_frame(format_ctx, &packet) >= 0 && cnt < 1000) { //read ~ 1000 frames

        std::cout << "1 Frame: " << cnt << std::endl;
        if (packet.stream_index == video_stream_index) {    //packet is video
            std::cout << "2 Is Video" << std::endl;
            if (stream == NULL) {    //create stream in file
                std::cout << "3 create stream" << std::endl;
                stream = avformat_new_stream(output_ctx,
                        format_ctx->streams[video_stream_index]->codec->codec);
                avcodec_copy_context(stream->codec,
                        format_ctx->streams[video_stream_index]->codec);
                stream->sample_aspect_ratio =
                        format_ctx->streams[video_stream_index]->codec->sample_aspect_ratio;
            }
            int check = 0;
            packet.stream_index = stream->id;
            std::cout << "4 decoding" << std::endl;
            int result = avcodec_decode_video2(codec_ctx, picture, &check, &packet);
            std::cout << "Bytes decoded " << result << " check " << check
                    << std::endl;
            if (cnt > 100)    //cnt < 0)
                    {
                sws_scale(img_convert_ctx, picture->data, picture->linesize, 0,
                        codec_ctx->height, picture_rgb->data, picture_rgb->linesize);
                std::stringstream file_name;
                file_name << "test" << cnt << ".ppm";
                output_file.open(file_name.str().c_str());
                output_file << "P3 " << codec_ctx->width << " " << codec_ctx->height
                        << " 255\n";
                for (int y = 0; y < codec_ctx->height; y++) {
                    for (int x = 0; x < codec_ctx->width * 3; x++)
                        output_file
                                << (int) (picture_rgb->data[0]
                                        + y * picture_rgb->linesize[0])[x] << " ";
                }
                output_file.close();
            }
            cnt++;
        }
        av_free_packet(&packet);
        av_init_packet(&packet);
    }
    av_free(picture);
    av_free(picture_rgb);
    av_free(picture_buffer);
    av_free(picture_buffer_2);

    av_read_pause(format_ctx);
    avio_close(output_ctx->pb);
    avformat_free_context(output_ctx);

    return (EXIT_SUCCESS);
}
_______________________________________________
ffmpeg-user mailing list
[hidden email]
https://ffmpeg.org/mailman/listinfo/ffmpeg-user

To unsubscribe, visit link above, or email
[hidden email] with subject "unsubscribe".
Reply | Threaded
Open this post in threaded view
|

Re: Error read format to my program.

ABDALLAH Moussa
Up

> Le 22 févr. 2019 à 17:19, ABDALLAH Moussa <[hidden email]> a écrit :
>
> Hello,
>
> I don't know if it's the good place to ask that but I have a problem with my program. It's a program to try to save a stream video from an ip camera to a file. When I try to execute my program this is the error that's returns on the console :
>
> [root@localhost Téléchargements]# ./my_streamer
> [ingenient @ 0xbeec60] Could not find codec parameters for stream 0 (Video: mjpeg, none(bt470bg/unknown/unknown)): unspecified size
> Consider increasing the value for the 'analyzeduration' and 'probesize' options
> [root@localhost Téléchargements]#
>
> Is there a way to force the program to read a mjpeg video if it don't find it ?
>
> When I write the command line bellow everythings works fine :
>
> [root@localhost Téléchargements]# ffmpeg -i http://192.9.200.121/ipcam/mjpeg.cgi -y -map 0 -t 5 -c copy -f matroska  _capture.mkv
> ffmpeg version N-48170-gc8bc9d1380-static https://johnvansickle.com/ffmpeg/  Copyright (c) 2000-2019 the FFmpeg developers
>  built with gcc 6.3.0 (Debian 6.3.0-18+deb9u1) 20170516
>  configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev=sndio --disable-outdev=sndio --cc=gcc-6 --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gmp --enable-gray --enable-libaom --enable-libfribidi --enable-libass --enable-libvmaf --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librubberband --enable-libsoxr --enable-libspeex --enable-libvorbis --enable-libopus --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libdav1d --enable-libxvid --enable-libzvbi --enable-libzimg
>  libavutil      56. 26.100 / 56. 26.100
>  libavcodec     58. 47.102 / 58. 47.102
>  libavformat    58. 26.101 / 58. 26.101
>  libavdevice    58.  6.101 / 58.  6.101
>  libavfilter     7. 48.100 /  7. 48.100
>  libswscale      5.  4.100 /  5.  4.100
>  libswresample   3.  4.100 /  3.  4.100
>  libpostproc    55.  4.100 / 55.  4.100
> Input #0, mpjpeg, from 'http://192.9.200.121/ipcam/mjpeg.cgi':
>  Duration: N/A, bitrate: N/A
>    Stream #0:0: Video: mjpeg (Baseline), yuvj420p(pc, bt470bg/unknown/unknown), 1920x1080 [SAR 1:1 DAR 16:9], 25 tbr, 25 tbn, 25 tbc
> Output #0, matroska, to '_capture.mkv':
>  Metadata:
>    encoder         : Lavf58.26.101
>    Stream #0:0: Video: mjpeg (Baseline) (MJPG / 0x47504A4D), yuvj420p(pc, bt470bg/unknown/unknown), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 25 tbr, 1k tbn, 25 tbc
> Stream mapping:
>  Stream #0:0 -> #0:0 (copy)
> Press [q] to stop, [?] for help
> frame=  125 fps= 23 q=-1.0 Lsize=   16528kB time=00:00:04.96 bitrate=27292.4kbits/s speed=0.914x
> video:16521kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.039828%
> [root@localhost Téléchargements]#
>
> Thanks a lot for your help !
>
> This is my source (I take it on the web it is only to test to save a stream video to a file like I said before):
>
> #include <stdio.h>
> #include <stdlib.h>
> #include <iostream>
> #include <fstream>
> #include <sstream>
>
> extern "C" {
> #include <libavcodec/avcodec.h>
> #include <libavformat/avformat.h>
> #include <libavformat/avio.h>
> #include <libswscale/swscale.h>
> }
>
> int main(int argc, char** argv) {
>
>    // Open the initial context variables that are needed
>    SwsContext *img_convert_ctx;
>    AVFormatContext* format_ctx = avformat_alloc_context();
>    AVCodecContext* codec_ctx = NULL;
>    int video_stream_index;
>
>    // Register everything
>    av_register_all();
>    avformat_network_init();
>
>    //open RTSP
>    if (avformat_open_input(&format_ctx, "http://192.9.200.121/ipcam/mjpeg.cgi",
>            NULL, NULL) != 0) {
>        return EXIT_FAILURE;
>    }
>
>    if (avformat_find_stream_info(format_ctx, NULL) < 0) {
>        return EXIT_FAILURE;
>    }
>
>    //search video stream
>    for (int i = 0; i < format_ctx->nb_streams; i++) {
>        if (format_ctx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO)
>            video_stream_index = i;
>    }
>
>    AVPacket packet;
>    av_init_packet(&packet);
>
>    //open output file
>    AVFormatContext* output_ctx = avformat_alloc_context();
>
>    AVStream* stream = NULL;
>    int cnt = 0;
>
>    //start reading packets from stream and write them to file
>    av_read_play(format_ctx);    //play RTSP
>
>    // Get the codec
>    AVCodec *codec = NULL;
>    codec = avcodec_find_decoder(AV_CODEC_ID_H264);
>    if (!codec) {
>        exit(1);
>    }
>
>    // Add this to allocate the context by codec
>    codec_ctx = avcodec_alloc_context3(codec);
>
>    avcodec_get_context_defaults3(codec_ctx, codec);
>    avcodec_copy_context(codec_ctx, format_ctx->streams[video_stream_index]->codec);
>    std::ofstream output_file;
>
>    if (avcodec_open2(codec_ctx, codec, NULL) < 0)
>        exit(1);
>
>    img_convert_ctx = sws_getContext(codec_ctx->width, codec_ctx->height,
>            codec_ctx->pix_fmt, codec_ctx->width, codec_ctx->height, AV_PIX_FMT_RGB24,
>            SWS_BICUBIC, NULL, NULL, NULL);
>
>    int size = avpicture_get_size(AV_PIX_FMT_YUV420P, codec_ctx->width,
>            codec_ctx->height);
>    uint8_t* picture_buffer = (uint8_t*) (av_malloc(size));
>    AVFrame* picture = av_frame_alloc();
>    AVFrame* picture_rgb = av_frame_alloc();
>    int size2 = avpicture_get_size(AV_PIX_FMT_RGB24, codec_ctx->width,
>            codec_ctx->height);
>    uint8_t* picture_buffer_2 = (uint8_t*) (av_malloc(size2));
>    avpicture_fill((AVPicture *) picture, picture_buffer, AV_PIX_FMT_YUV420P,
>            codec_ctx->width, codec_ctx->height);
>    avpicture_fill((AVPicture *) picture_rgb, picture_buffer_2, AV_PIX_FMT_RGB24,
>            codec_ctx->width, codec_ctx->height);
>
>    while (av_read_frame(format_ctx, &packet) >= 0 && cnt < 1000) { //read ~ 1000 frames
>
>        std::cout << "1 Frame: " << cnt << std::endl;
>        if (packet.stream_index == video_stream_index) {    //packet is video
>            std::cout << "2 Is Video" << std::endl;
>            if (stream == NULL) {    //create stream in file
>                std::cout << "3 create stream" << std::endl;
>                stream = avformat_new_stream(output_ctx,
>                        format_ctx->streams[video_stream_index]->codec->codec);
>                avcodec_copy_context(stream->codec,
>                        format_ctx->streams[video_stream_index]->codec);
>                stream->sample_aspect_ratio =
>                        format_ctx->streams[video_stream_index]->codec->sample_aspect_ratio;
>            }
>            int check = 0;
>            packet.stream_index = stream->id;
>            std::cout << "4 decoding" << std::endl;
>            int result = avcodec_decode_video2(codec_ctx, picture, &check, &packet);
>            std::cout << "Bytes decoded " << result << " check " << check
>                    << std::endl;
>            if (cnt > 100)    //cnt < 0)
>                    {
>                sws_scale(img_convert_ctx, picture->data, picture->linesize, 0,
>                        codec_ctx->height, picture_rgb->data, picture_rgb->linesize);
>                std::stringstream file_name;
>                file_name << "test" << cnt << ".ppm";
>                output_file.open(file_name.str().c_str());
>                output_file << "P3 " << codec_ctx->width << " " << codec_ctx->height
>                        << " 255\n";
>                for (int y = 0; y < codec_ctx->height; y++) {
>                    for (int x = 0; x < codec_ctx->width * 3; x++)
>                        output_file
>                                << (int) (picture_rgb->data[0]
>                                        + y * picture_rgb->linesize[0])[x] << " ";
>                }
>                output_file.close();
>            }
>            cnt++;
>        }
>        av_free_packet(&packet);
>        av_init_packet(&packet);
>    }
>    av_free(picture);
>    av_free(picture_rgb);
>    av_free(picture_buffer);
>    av_free(picture_buffer_2);
>
>    av_read_pause(format_ctx);
>    avio_close(output_ctx->pb);
>    avformat_free_context(output_ctx);
>
>    return (EXIT_SUCCESS);
> }
> _______________________________________________
> ffmpeg-user mailing list
> [hidden email]
> https://ffmpeg.org/mailman/listinfo/ffmpeg-user
>
> To unsubscribe, visit link above, or email
> [hidden email] with subject "unsubscribe".
_______________________________________________
ffmpeg-user mailing list
[hidden email]
https://ffmpeg.org/mailman/listinfo/ffmpeg-user

To unsubscribe, visit link above, or email
[hidden email] with subject "unsubscribe".
Reply | Threaded
Open this post in threaded view
|

Re: Error read format to my program.

Carl Eugen Hoyos-2
In reply to this post by ABDALLAH Moussa
2019-02-22 17:19 GMT+01:00, ABDALLAH Moussa <[hidden email]>:

> I don't know if it's the good place to ask that but I have a problem with my
> program. It's a program to try to save a stream video from an ip camera to a
> file. When I try to execute my program this is the error that's returns on
> the console :
>
> [root@localhost Téléchargements]# ./my_streamer
> [ingenient @ 0xbeec60] Could not find codec parameters for stream 0

This indicates that either you don't feed the input data into the demuxer
or that your libavformat version is old.

[...]

> Is there a way to force the program to read a mjpeg video
> if it don't find it ?

Note that (as you can see from the console output you posted)
that your input is not mjpeg format.

Please use the correct mailing list, Carl Eugen
_______________________________________________
ffmpeg-user mailing list
[hidden email]
https://ffmpeg.org/mailman/listinfo/ffmpeg-user

To unsubscribe, visit link above, or email
[hidden email] with subject "unsubscribe".