Up > Le 22 févr. 2019 à 17:19, ABDALLAH Moussa <[email protected]> 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 > [email protected] > https://ffmpeg.org/mailman/listinfo/ffmpeg-user > > To unsubscribe, visit link above, or email > [email protected] with subject "unsubscribe". _______________________________________________ ffmpeg-user mailing list [email protected] https://ffmpeg.org/mailman/listinfo/ffmpeg-user
To unsubscribe, visit link above, or email [email protected] with subject "unsubscribe".
