[Libav-user] Stuck in avformat_write_header when using RTSP
Yu Ang Tan
isoboy at gmail.com
Tue Apr 5 08:26:34 CEST 2016
I am trying to send an encoded stream with the code below, but it only
works when there is another application listening at the provided URL.
If the listening application isn't ready, this program gets stuck in
avformat_write_header () without returning. Is there any way for me to
provide an interrupt callback, or timeout so that I can resume the program?
Thanks in advance.
/*******************************************************************************
* Video encoding example
*******************************************************************************/
int main(int argc, char** argv)
{
AVCodec *codec = NULL;
AVCodecContext *codecCtx= NULL;
AVFormatContext *pFormatCtx = NULL;
AVStream * pVideoStream = NULL;
AVFrame *picture = NULL;
int i, x, y, //
ret, // Return value
got_packet_ptr; // Data encoded into packet
// Register all formats and codecs
avcodec_register_all();
av_register_all();
avformat_network_init();
char filename[100] ;
sprintf_s(filename,sizeof(filename),"%s","rtsp://
192.168.1.7:8554/live.sdp");
if(argc>1)
{
sprintf_s(filename,sizeof(filename),"%s",argv[1]);
}
printf_s("URL: %s\n", filename);
// allocate context
ret = avformat_alloc_output_context2( &pFormatCtx, NULL, "rtsp",
filename );
if ( !pFormatCtx || ret < 0 )
{
fprintf(stderr,"Could not allocate output context" );
}
pFormatCtx->flags |= AVFMT_FLAG_NOBUFFER|AVFMT_FLAG_FLUSH_PACKETS;
pFormatCtx->max_interleave_delta = 1;
pFormatCtx->oformat->video_codec = AV_CODEC_ID_H264;
// Find the codec.
codec = avcodec_find_encoder(pFormatCtx->oformat->video_codec);
if (codec == NULL) {
fprintf(stderr, "Codec not found\n");
return -1;
}
// Add stream to pFormatCtx
pVideoStream = avformat_new_stream(pFormatCtx, codec);
if (!pVideoStream)
{
fprintf(stderr, "Cannot add new video stream\n");
return -1;
}
int framerate = 10;
pVideoStream->id = pFormatCtx->nb_streams-1;
pVideoStream->time_base.den = framerate;
pVideoStream->time_base.num = 1;
// Set context
codecCtx = pVideoStream->codec;
codecCtx->pix_fmt = AV_PIX_FMT_YUV420P;
codecCtx->profile = FF_PROFILE_H264_BASELINE;
// Resolution must be a multiple of two.
codecCtx->width = 320;
codecCtx->height = 240;
codecCtx->bit_rate = 1000000;
codecCtx->time_base.den = framerate;
codecCtx->time_base.num = 1;
codecCtx->gop_size = 12; // emit one intra frame every twelve frames at
most
if (pFormatCtx->oformat->flags & AVFMT_GLOBALHEADER)
codecCtx->flags |= CODEC_FLAG_GLOBAL_HEADER;
// Open the codec.
if (avcodec_open2(codecCtx, codec, NULL) < 0)
{
fprintf(stderr, "Cannot open video codec\n");
return -1;
}
ret = avio_open2(&pFormatCtx->pb, filename, AVIO_FLAG_WRITE, NULL,
NULL);
if (ret < 0)
{
// Error "Protocol not found"
av_strerror(ret,errbuf, ERRBUFFLEN);
fprintf(stderr, "avio_open2() fail: %s\n", errbuf);
//return -1;
}
// Write file header. (Gets stuck here)
ret = avformat_write_header(pFormatCtx, NULL);
if ( ret < 0 )
{
fprintf(stderr, "error writing header");
return -1;
}
// ...more code
}
--
Ang
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://ffmpeg.org/pipermail/libav-user/attachments/20160405/9d1f4fc2/attachment.html>
More information about the Libav-user
mailing list