I have used ffmpeg 2.6.3 to record audio and video from multiple IP camera multicast over respective multicast IP but on same audio and video port on a PC having RHEL 6.6 OS.
I found that for single camera it is working fine but when 2 or more camera is used then the video is getting mixed. On further searching I found some material about some disagreement on the implementation of multicast receiving between some application developers and kernel developer on who should own this problem. I don't know if this problem is resolved or not now or whether this is problem or not in the first place. But I needed to get it working and found that the socket parameter IP_MULTICAST_ALL can help in this situation. Also since I am making audio/video recording I found that sometimes but very rarely ffmpeg is not able to get the video codec information so it records audio only. So I made it to quit if it didn't record video. I am uploading/sharing the patch I did for what I need. Hope it might help any who needs similar behavior. I can't say if what I did is correct or not but it is working for what I need. The patch is diff -crB ffmpeg-2.6.3-orig/libavformat/udp.c ffmpeg-2.5.3/libavformat/udp.c *** ffmpeg-2.6.3-orig/libavformat/udp.c 2015-03-03 15:54:00.000000000 +0530 --- ffmpeg-2.6.3/libavformat/udp.c 2015-04-08 14:46:30.000000000 +0530 *************** *** 181,186 **** --- 181,191 ---- log_net_error(NULL, AV_LOG_ERROR, "setsockopt(IP_ADD_MEMBERSHIP)"); return -1; } + int mc=0; + if(setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_ALL, (const void *)&mc, sizeof(mc)) < 0) + { + log_net_error(NULL, AV_LOG_ERROR, "setsockopt(IP_MULTICAST_ALL)"); + } } #endif #if HAVE_STRUCT_IPV6_MREQ && defined(IPPROTO_IPV6) diff -crB ffmpeg-2.6.3-orig/libavformat/utils.c ffmpeg-2.5.3/libavformat/utils.c *** ffmpeg-2.6.3-orig/libavformat/utils.c 2015-01-10 09:51:16.000000000 +0530 --- ffmpeg-2.6.3/libavformat/utils.c 2015-04-08 19:29:17.763130726 +0530 *************** *** 3431,3437 **** if (ret >= 0 && ic->nb_streams) /* We could not have all the codec parameters before EOF. */ ret = -1; ! for (i = 0; i < ic->nb_streams; i++) { const char *errmsg; st = ic->streams[i]; if (!has_codec_parameters(st, &errmsg)) { --- 3431,3438 ---- if (ret >= 0 && ic->nb_streams) /* We could not have all the codec parameters before EOF. */ ret = -1; ! int breakloop = 0; ! for (i = 0; i < ic->nb_streams&&breakloop==0; i++) { const char *errmsg; st = ic->streams[i]; if (!has_codec_parameters(st, &errmsg)) { *************** *** 3441,3446 **** --- 3442,3452 ---- "Could not find codec parameters for stream %d (%s): %s\n" "Consider increasing the value for the 'analyzeduration' and 'probesize' options\n", i, buf, errmsg); + if(strstr(buf,"h264")) + { + av_log(ic, AV_LOG_WARNING,"Quitting as video stream could not be decoded\n"); + breakloop = 1; + } } else { ret = 0; } *************** *** 3460,3465 **** --- 3466,3476 ---- if (ic->pb) av_log(ic, AV_LOG_DEBUG, "After avformat_find_stream_info() pos: %"PRId64" bytes read:%"PRId64" seeks:%d frames:%d\n", avio_tell(ic->pb), ic->pb->bytes_read, ic->pb->seek_count, count); + if(breakloop!=0) + { + ret = -1; + ic->nb_streams=0; + } return ret; } udp.c is for mixing of stream and utils.c is for making ffmpeg quit
ffmpeg.patch
Description: Binary data
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel