[Libav-user] RTSP with ffmpeg 4.1

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

[Libav-user] RTSP with ffmpeg 4.1

Thierry Gayet
Hello guys,

We are currently trying to stream a video (h264) and audio (opus) stream through an RTSP connection. 

It worked well until a change of API. Indeed, since then we have been using the version installed by ubuntu 16.04. 

On the way to ubuntu 18.04, it didn't work anymore. We have tried to adapt the APIs to the more recent one, but we still have a problem.

Among the people subscribed to this mailing list or even developers of FFmpeg, are there people who have already used an RTSP connection (as a client) on the last API? I can't find anything among the examples?

Here is the code used:

  AVCodecContext * avctx;
  char filename[500];
  char stream_title[256];
  AVCodec       *audio_input_codec;
  AVCodec       *audio_output_codec;
  AVCodecContext *audio_input_codec_context;
  AVCodecContext *audio_output_codec_context;
  AVStream      *audio_stream;
  AVOutputFormat         *video_output_codec;
  AVCodecContext *video_output_codec_context;
  AVStream        *video_stream;
  AVFormatContext *rtsp_format_context;

  av_register_all();
  avformat_network_init();

  audio_input_codec = NULL;
  audio_output_codec = NULL;
  audio_input_codec_context = NULL;
  audio_output_codec_context = NULL;
  audio_stream = NULL;

  video_output_codec = NULL;
  video_output_codec_context = NULL;
  video_stream = NULL;
  rtsp_format_context = NULL;

  /* Open RTSP muxer */
  snprintf(filename, sizeof(filename), "rtsp://127.0.0.1:5544/live/session_12135464647967643468");
  printf("Publishing RTSP stream on %s\n", filename);

  err = avformat_alloc_output_context2(&rtsp_format_context, NULL, "rtsp", filename);

  video_output_codec = avcodec_find_encoder(AV_CODEC_ID_H264);
  if (!video_output_codec) {
    printf("Could not initialize H264 codec\n");
    return (-1);
  }

  video_stream = avformat_new_stream(rtsp_format_context, video_output_codec);
  if (!channel->video_stream) {
    printf("Could not create video stream\n");
    return(-1);
  }

  avctx = avcodec_alloc_context3(video_output_codec);
  err   = avcodec_parameters_to_context(avctx, video_stream->codecpar);
  if(err < 0){
    printf("Could not initialize video_output_codec_context parameters %d\n" , err);
    avcodec_free_context(&avctx);
    return(-1);
  }
  video_output_codec_context = avctx;
  video_output_codec_context->codec_type   = AVMEDIA_TYPE_VIDEO;
  video_output_codec_context->codec_id     = AV_CODEC_ID_H264;
  video_output_codec_context->thread_count = 1;

  /*
   * Those video codec parameters must be set up even if our video codec is
   * a fake one (i.e. no encoding is involved, we forward video packets with
   * no changes). This is basically used to generate a correct
   * sprop-parameter-sets in the SDP file, which is also useless since H264
   * parameters are transmitted inband in H264 SPS PPS packets (that's the case
   * at least for webRTC).
   */
  video_output_codec_context->width = 960;
  video_output_codec_context->height = 720;
  video_output_codec_context->time_base = (AVRational) {1, 15};
  video_output_codec_context->bit_rate = 600000;
  video_output_codec_context->pix_fmt = AV_PIX_FMT_YUV420P;

  /*
   *  H264 profile-id setup
   *  For some reason it doesn't work just by setting up
   *  FF_PROFILE_H264_CONSTRAINED_BASELINE. An obscure av_opt_set function must be
   *  called ...
   */
  av_opt_set(video_output_codec_context->priv_data, "profile", "baseline", AV_OPT_SEARCH_CHILDREN);

  video_output_codec_context->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
  video_stream->time_base = (AVRational) {1, 15};

  err = avcodec_open2(channel->video_output_codec_context, channel->video_output_codec, NULL);  


  /* OPUS Decoder init */
  audio_input_codec = avcodec_find_decoder(AV_CODEC_ID_OPUS);
  if (!audio_input_codec){
    printf("Could not initialize OPUS codec\n");
    return (-1);
  }

  audio_input_codec_context = avcodec_alloc_context3(audio_input_codec);
  if (!audio_input_codec_context) {
    printf("Could not initialize OPUS codec context\n");
    return (-1);
  }

  err = avcodec_open2(audio_input_codec_context, audio_input_codec, NULL);

  err = avformat_write_header(&rtsp_format_context, NULL);

Here are some traces while initializing :

[libx264 @ 0x557123450480] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2 AVX512

[libx264 @ 0x557123450480] profile Constrained Baseline, level 3.1

[libx264 @ 0x557123450480] 264 - core 152 r2854 e9a5903 - H.264/MPEG-4 AVC codec - Copyleft 2003-2017 - http://www.videolan.org/x264.html - options: cabac=0 ref=3 deblock=1:0:0 analyse=0x1:0x111 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=1 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=0 keyint=250 keyint_min=15 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=abr mbtree=1 bitrate=600 ratetol=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Adding metadata for ffmpeg expected for evostream : dazzl_12135464647967643468

[rtsp @ 0x55712344bfe0] Using AVStream.codec to pass codec parameters to muxers is deprecated, use AVStream.codecpar instead.

[rtsp @ 0x55712344bfe0] dimensions not set

At the end it stuck with the avformat_write_header because of the initialisation maybe in relation with the two RTSP traces

Thanks in advance of your reply !
--

Regards

Thierry GAYET

(Courrouze)
Village by CA
3 avenue Germaine Tillon
Saint Jacques de la Lande.

_______________________________________________
Libav-user mailing list
[hidden email]
https://ffmpeg.org/mailman/listinfo/libav-user

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

Re: RTSP with ffmpeg 4.1

MSC_Edge
I believe  "avformat_write_header" can be omitted for RTSP Stream and it'll just blow right through it.

Working on a similar problem.. outputting to RTSP stream , crazy thing is I had it working, then had git issues and the whole thing broke and now can't remember what I'm doing wrong.

Getting an error myself when I call 'av_write_frame', it'll crash and tell me:
Exception thrown at 0x00007FF84B59291A (avformat-58.dll) in Ffmpeg_Simple_Server.exe: 0xC0000005: Access violation writing location 0x0000000000000000.

If you manage to get past this, I'd appreciate a look at your working code. Good luck.


On Tue, Feb 4, 2020 at 11:28 AM Thierry Gayet <[hidden email]> wrote:
Hello guys,

We are currently trying to stream a video (h264) and audio (opus) stream through an RTSP connection. 

It worked well until a change of API. Indeed, since then we have been using the version installed by ubuntu 16.04. 

On the way to ubuntu 18.04, it didn't work anymore. We have tried to adapt the APIs to the more recent one, but we still have a problem.

Among the people subscribed to this mailing list or even developers of FFmpeg, are there people who have already used an RTSP connection (as a client) on the last API? I can't find anything among the examples?

Here is the code used:

  AVCodecContext * avctx;
  char filename[500];
  char stream_title[256];
  AVCodec       *audio_input_codec;
  AVCodec       *audio_output_codec;
  AVCodecContext *audio_input_codec_context;
  AVCodecContext *audio_output_codec_context;
  AVStream      *audio_stream;
  AVOutputFormat         *video_output_codec;
  AVCodecContext *video_output_codec_context;
  AVStream        *video_stream;
  AVFormatContext *rtsp_format_context;

  av_register_all();
  avformat_network_init();

  audio_input_codec = NULL;
  audio_output_codec = NULL;
  audio_input_codec_context = NULL;
  audio_output_codec_context = NULL;
  audio_stream = NULL;

  video_output_codec = NULL;
  video_output_codec_context = NULL;
  video_stream = NULL;
  rtsp_format_context = NULL;

  /* Open RTSP muxer */
  snprintf(filename, sizeof(filename), "rtsp://127.0.0.1:5544/live/session_12135464647967643468");
  printf("Publishing RTSP stream on %s\n", filename);

  err = avformat_alloc_output_context2(&rtsp_format_context, NULL, "rtsp", filename);

  video_output_codec = avcodec_find_encoder(AV_CODEC_ID_H264);
  if (!video_output_codec) {
    printf("Could not initialize H264 codec\n");
    return (-1);
  }

  video_stream = avformat_new_stream(rtsp_format_context, video_output_codec);
  if (!channel->video_stream) {
    printf("Could not create video stream\n");
    return(-1);
  }

  avctx = avcodec_alloc_context3(video_output_codec);
  err   = avcodec_parameters_to_context(avctx, video_stream->codecpar);
  if(err < 0){
    printf("Could not initialize video_output_codec_context parameters %d\n" , err);
    avcodec_free_context(&avctx);
    return(-1);
  }
  video_output_codec_context = avctx;
  video_output_codec_context->codec_type   = AVMEDIA_TYPE_VIDEO;
  video_output_codec_context->codec_id     = AV_CODEC_ID_H264;
  video_output_codec_context->thread_count = 1;

  /*
   * Those video codec parameters must be set up even if our video codec is
   * a fake one (i.e. no encoding is involved, we forward video packets with
   * no changes). This is basically used to generate a correct
   * sprop-parameter-sets in the SDP file, which is also useless since H264
   * parameters are transmitted inband in H264 SPS PPS packets (that's the case
   * at least for webRTC).
   */
  video_output_codec_context->width = 960;
  video_output_codec_context->height = 720;
  video_output_codec_context->time_base = (AVRational) {1, 15};
  video_output_codec_context->bit_rate = 600000;
  video_output_codec_context->pix_fmt = AV_PIX_FMT_YUV420P;

  /*
   *  H264 profile-id setup
   *  For some reason it doesn't work just by setting up
   *  FF_PROFILE_H264_CONSTRAINED_BASELINE. An obscure av_opt_set function must be
   *  called ...
   */
  av_opt_set(video_output_codec_context->priv_data, "profile", "baseline", AV_OPT_SEARCH_CHILDREN);

  video_output_codec_context->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
  video_stream->time_base = (AVRational) {1, 15};

  err = avcodec_open2(channel->video_output_codec_context, channel->video_output_codec, NULL);  


  /* OPUS Decoder init */
  audio_input_codec = avcodec_find_decoder(AV_CODEC_ID_OPUS);
  if (!audio_input_codec){
    printf("Could not initialize OPUS codec\n");
    return (-1);
  }

  audio_input_codec_context = avcodec_alloc_context3(audio_input_codec);
  if (!audio_input_codec_context) {
    printf("Could not initialize OPUS codec context\n");
    return (-1);
  }

  err = avcodec_open2(audio_input_codec_context, audio_input_codec, NULL);

  err = avformat_write_header(&rtsp_format_context, NULL);

Here are some traces while initializing :

[libx264 @ 0x557123450480] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2 AVX512

[libx264 @ 0x557123450480] profile Constrained Baseline, level 3.1

[libx264 @ 0x557123450480] 264 - core 152 r2854 e9a5903 - H.264/MPEG-4 AVC codec - Copyleft 2003-2017 - http://www.videolan.org/x264.html - options: cabac=0 ref=3 deblock=1:0:0 analyse=0x1:0x111 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=1 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=0 keyint=250 keyint_min=15 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=abr mbtree=1 bitrate=600 ratetol=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Adding metadata for ffmpeg expected for evostream : dazzl_12135464647967643468

[rtsp @ 0x55712344bfe0] Using AVStream.codec to pass codec parameters to muxers is deprecated, use AVStream.codecpar instead.

[rtsp @ 0x55712344bfe0] dimensions not set

At the end it stuck with the avformat_write_header because of the initialisation maybe in relation with the two RTSP traces

Thanks in advance of your reply !
--

Regards

Thierry GAYET

(Courrouze)
Village by CA
3 avenue Germaine Tillon
Saint Jacques de la Lande.
_______________________________________________
Libav-user mailing list
[hidden email]
https://ffmpeg.org/mailman/listinfo/libav-user

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


--
Matthew Czarnek
(814) 421-6770

_______________________________________________
Libav-user mailing list
[hidden email]
https://ffmpeg.org/mailman/listinfo/libav-user

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