I finnaly found where was the problem. It's was because of the parameter give to the function : avcodec_find_decoder(AV_CODEC_ID_H264); I change dit by avcodec_find_decoder(format_ctx->streams[video_stream_index]->codec->codec_id); and everything works fine.
De : Libav-user <[email protected]> De la part de ABDALLAH Moussa Envoyé : lundi 25 février 2019 11:28 À : [email protected] Objet : [Libav-user] Codec type or id mismatches. Hello, I'm trying to write a stream video from an ip camero to a file using a source that I get on the web and I got an error on the function avcodec_open2(codec_ctx, codec, NULL). Indeed when I compile the program and I execute it this is what I get on the console : [h264 @ 0x33670c0] Codec type or id mismatches. FFmpeg is new for me and I don't know again how it's working exactly. My question is do you know what this error means please ? This is the command line to compile my program : g++ -w my_streamer.cpp -o my_streamer $(pkg-config --cflags --libs libavcodec libavformat libswscale libavutil). This is what I get on the console after execute the program (I add the number 1,2,3,4,... to find where the error appears) : [root@localhost Téléchargements]# ./my_streamer 1 2 3 4 5 6 7 8 [h264 @ 0x42e00c0] Codec type or id mismatches This is the source code that I get on the web : #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) { printf("1\n"); // 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(); printf("2\n"); //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; } printf("3\n"); //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); printf("4\n"); //open output file AVFormatContext* output_ctx = avformat_alloc_context(); AVStream* stream = NULL; int cnt = 0; printf("5\n"); //start reading packets from stream and write them to file av_read_play(format_ctx); //play RTSP printf("6\n"); // Get the codec AVCodec *codec = NULL; codec = avcodec_find_decoder(AV_CODEC_ID_H264); if (!codec) { exit(1); } printf("7\n"); // 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; printf("8\n"); if (avcodec_open2(codec_ctx, codec, NULL) < 0) exit(1); printf("9\n"); 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); printf("10\n"); 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); printf("11\n"); 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); } Thanks you very much for your help, Moussa.
_______________________________________________ Libav-user mailing list [email protected] https://ffmpeg.org/mailman/listinfo/libav-user To unsubscribe, visit link above, or email [email protected] with subject "unsubscribe".
