[FFmpeg-devel] Live encoding into mxf...
Hello everyone, I'm trying to encode video and audio directly from a capture board, 1 video stream and 8 single channel audio streams into a MXF file encoding it in Mpeg-2. Everything is working fine except when I call av_write_trailer() at the end (and before freeing CodecContext as stated in the documentation). After using av_write_trailer, I end up with the whole video looking like this http://i.imgur.com/M6HkcpR.jpg . It seems like the decoder is misplacing the b-frames in the wrong position, but If i don't call this function I can play the media file, with the image as it should be, in VLC but the timestamp is completely wrong. Looking at mediainfo I can see that my file doesn't have the file duration (which later made sense when I looked inside the code.) After a few hours with the file mxfenc.c found that if I comment the next part inside the function mxf_write_footer(), the write trailer "kinda" works, (...) if (mxf->edit_unit_byte_count && s->oformat != &ff_mxf_opatom_muxer) { // no need to repeat index if ((err = mxf_write_partition(s, 0, 0, footer_partition_key, 0)) < 0) return err; } /*else { if ((err = mxf_write_partition(s, 0, 2, footer_partition_key, 0)) < 0) return err; mxf_write_klv_fill(s); mxf_write_index_table_segment(s); }*/ (...) The "kinda" works part, its because I can play the file correctly in VLC with the correct timestamps, and if I open it with Mediainfo everything looks good, but If I try to open it with Sorenson Squeeze (for example), I get a warning saying "Squeeze does not support playing this file". I carefully followed the documentation, samples, examples and I'm still stuck :S. I am using the ffmpeg 2.5.1 version and I also added a few changes that I saw in the master, and nothing changed. Additional info: Target Output file format is a 1080i59.94, XDCam 30Mbit MXF op1a. Regarding the 8 audio streams the codec options have the one provided by avcodec_get_context_defaults3 plus this changes: audio_codec_context->channels=1; audio_codec_context->sample_rate = 48000; audio_codec_context->bit_rate = 768000; audio_codec_context->sample_fmt =AV_SAMPLE_FMT_S16; audio_codec_context->flags= CODEC_FLAG_GLOBAL_HEADER; audio_codec_context->time_base->num = 48000; Regarding video I also do avcodec_get_context_defaults3 plus this: video_codec_context-> pix_fmt= AV_PIX_FMT_YUV422P; video_codec_context->height = 1080; video_codec_context->time_base->den = 3; video_codec_context->time_base->num = 1001; video_codec_context->field_order= AVFieldOrder.AV_FIELD_TB; video_codec_context->width = 1920; video_codec_context->codec_id= AV_CODEC_ID_MPEG2VIDEO; video_codec_context->has_b_frames= 1; video_codec_context->max_b_frames = 2; video_codec_context->gop_size= 12; video_codec_context->global_quality= FF_QP2LAMBDA * 1; video_codec_context->rc_initial_buffer_occupancy= 10695476; video_codec_context->scenechange_threshold = 10; video_codec_context->color_primaries= AVCOL_PRI_BT709; video_codec_context->color_trc= AVCOL_TRC_BT709; video_codec_context->qmin= 1; video_codec_context->flags |= CODEC_FLAG_GLOBAL_HEADER | CODEC_FLAG_INTERLACED_DCT | CODEC_FLAG_INTERLACED_ME; video_codec_context->bit_rate = 3000; video_codec_context->rc_min_rate= 3000; video_codec_context->rc_max_rate= 3000; video_codec_context->rc_buffer_size= 10695476; I also had specified me_method and me_range, but nothing changed. Any idea what might be the problem? Thanks guys, Cheers ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
Re: [FFmpeg-devel] Live encoding into mxf...
2015-02-26 23:46 GMT+00:00 Michael Niedermayer : > On Thu, Feb 26, 2015 at 05:26:36PM +0000, Eng. Tweellt wrote: > > Hello everyone, > > > > I'm trying to encode video and audio directly from a capture board, 1 > video > > stream and 8 single channel audio streams into a MXF file encoding it in > > Mpeg-2. > > > > Everything is working fine except when I call av_write_trailer() at the > end > > (and before freeing CodecContext as stated in the documentation). > > > > After using av_write_trailer, I end up with the whole video looking like > > this http://i.imgur.com/M6HkcpR.jpg . It seems like the decoder is > > misplacing the b-frames in the wrong position, but If i don't call this > > function I can play the media file, with the image as it should be, in > VLC > > but the timestamp is completely wrong. > > Looking at mediainfo I can see that my file doesn't have the file > duration > > (which later made sense when I looked inside the code.) > > > > After a few hours with the file mxfenc.c found that if I comment the > next > > part inside the function mxf_write_footer(), the write trailer "kinda" > > works, > > > > (...) > > if (mxf->edit_unit_byte_count && s->oformat != &ff_mxf_opatom_muxer) { // > > no need to repeat index > > if ((err = mxf_write_partition(s, 0, 0, footer_partition_key, > 0)) < > > 0) > > return err; > > } /*else { > > if ((err = mxf_write_partition(s, 0, 2, footer_partition_key, > 0)) < > > 0) > > return err; > > mxf_write_klv_fill(s); > > mxf_write_index_table_segment(s); > > }*/ > > (...) > > > > The "kinda" works part, its because I can play the file correctly in VLC > > with the correct timestamps, and if I open it with Mediainfo everything > > looks good, but If I try to open it with Sorenson Squeeze (for example), > I > > get a warning saying "Squeeze does not support playing this file". > > I carefully followed the documentation, samples, examples and I'm still > > stuck :S. > > I am using the ffmpeg 2.5.1 version and I also added a few changes that I > > saw in the master, and nothing changed. > > > > Additional info: > > > > Target Output file format is a 1080i59.94, XDCam 30Mbit MXF op1a. > > > > Regarding the 8 audio streams the codec options have the one provided by > > avcodec_get_context_defaults3 plus this changes: > > > > audio_codec_context->channels=1; > > audio_codec_context->sample_rate = 48000; > > audio_codec_context->bit_rate = 768000; > > audio_codec_context->sample_fmt =AV_SAMPLE_FMT_S16; > > audio_codec_context->flags= CODEC_FLAG_GLOBAL_HEADER; > > audio_codec_context->time_base->num = 48000; > > > > > > Regarding video I also do avcodec_get_context_defaults3 plus this: > > > > video_codec_context-> pix_fmt= AV_PIX_FMT_YUV422P; > > video_codec_context->height = 1080; > > video_codec_context->time_base->den = 3; > > video_codec_context->time_base->num = 1001; > > video_codec_context->field_order= AVFieldOrder.AV_FIELD_TB; > > video_codec_context->width = 1920; > > video_codec_context->codec_id= AV_CODEC_ID_MPEG2VIDEO; > > video_codec_context->has_b_frames= 1; > > video_codec_context->max_b_frames = 2; > > video_codec_context->gop_size= 12; > > video_codec_context->global_quality= FF_QP2LAMBDA * 1; > > video_codec_context->rc_initial_buffer_occupancy= 10695476; > > video_codec_context->scenechange_threshold = 10; > > video_codec_context->color_primaries= AVCOL_PRI_BT709; > > video_codec_context->color_trc= AVCOL_TRC_BT709; > > video_codec_context->qmin= 1; > > video_codec_context->flags |= CODEC_FLAG_GLOBAL_HEADER | > > CODEC_FLAG_INTERLACED_DCT | CODEC_FLAG_INTERLACED_ME; > > video_codec_context->bit_rate = 3000; > > video_codec_context->rc_min_rate= 3000; > > video_codec_context->rc_max_rate= 3000; > > video_codec_context->rc_buffer_size= 10695476; > > > > > > I also had specified me_method and me_range, but nothing changed. > > > > Any idea what might be the problem? > > can the problem be reproduced with command line FFmpeg ? > > [...] > -- > Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB > > While the State exists there can be no freedom; when there is freedom there > will be no State. -- Vladimir Lenin > Hi Michael, I can't really tell. Encoding from another file seams to work fine but encoding from a live source it does not. Now there are some differences, for instance when getting frames from a live source I have to deal with PTS values, duration and so on. Is there a way to encode directly from a live source using command line? Cheers ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
Re: [FFmpeg-devel] Live encoding into mxf...
Hi Michael, I did what you've suggested and found out how to encode directly from a live source and it works indeed. I got some buffer alerts but the output video was much better than mine, without artifacts. When I'm encoding should I order the frames in some way? Cheers 2015-02-27 10:05 GMT+00:00 Eng. Tweellt : > > 2015-02-26 23:46 GMT+00:00 Michael Niedermayer : > >> On Thu, Feb 26, 2015 at 05:26:36PM +, Eng. Tweellt wrote: >> > Hello everyone, >> > >> > I'm trying to encode video and audio directly from a capture board, 1 >> video >> > stream and 8 single channel audio streams into a MXF file encoding it in >> > Mpeg-2. >> > >> > Everything is working fine except when I call av_write_trailer() at the >> end >> > (and before freeing CodecContext as stated in the documentation). >> > >> > After using av_write_trailer, I end up with the whole video looking like >> > this http://i.imgur.com/M6HkcpR.jpg . It seems like the decoder is >> > misplacing the b-frames in the wrong position, but If i don't call this >> > function I can play the media file, with the image as it should be, in >> VLC >> > but the timestamp is completely wrong. >> > Looking at mediainfo I can see that my file doesn't have the file >> duration >> > (which later made sense when I looked inside the code.) >> > >> > After a few hours with the file mxfenc.c found that if I comment the >> next >> > part inside the function mxf_write_footer(), the write trailer "kinda" >> > works, >> > >> > (...) >> > if (mxf->edit_unit_byte_count && s->oformat != &ff_mxf_opatom_muxer) { >> // >> > no need to repeat index >> > if ((err = mxf_write_partition(s, 0, 0, footer_partition_key, >> 0)) < >> > 0) >> > return err; >> > } /*else { >> > if ((err = mxf_write_partition(s, 0, 2, footer_partition_key, >> 0)) < >> > 0) >> > return err; >> > mxf_write_klv_fill(s); >> > mxf_write_index_table_segment(s); >> > }*/ >> > (...) >> > >> > The "kinda" works part, its because I can play the file correctly in VLC >> > with the correct timestamps, and if I open it with Mediainfo everything >> > looks good, but If I try to open it with Sorenson Squeeze (for >> example), I >> > get a warning saying "Squeeze does not support playing this file". >> > I carefully followed the documentation, samples, examples and I'm still >> > stuck :S. >> > I am using the ffmpeg 2.5.1 version and I also added a few changes that >> I >> > saw in the master, and nothing changed. >> > >> > Additional info: >> > >> > Target Output file format is a 1080i59.94, XDCam 30Mbit MXF op1a. >> > >> > Regarding the 8 audio streams the codec options have the one provided by >> > avcodec_get_context_defaults3 plus this changes: >> > >> > audio_codec_context->channels=1; >> > audio_codec_context->sample_rate = 48000; >> > audio_codec_context->bit_rate = 768000; >> > audio_codec_context->sample_fmt =AV_SAMPLE_FMT_S16; >> > audio_codec_context->flags= CODEC_FLAG_GLOBAL_HEADER; >> > audio_codec_context->time_base->num = 48000; >> > >> > >> > Regarding video I also do avcodec_get_context_defaults3 plus this: >> > >> > video_codec_context-> pix_fmt= AV_PIX_FMT_YUV422P; >> > video_codec_context->height = 1080; >> > video_codec_context->time_base->den = 3; >> > video_codec_context->time_base->num = 1001; >> > video_codec_context->field_order= AVFieldOrder.AV_FIELD_TB; >> > video_codec_context->width = 1920; >> > video_codec_context->codec_id= AV_CODEC_ID_MPEG2VIDEO; >> > video_codec_context->has_b_frames= 1; >> > video_codec_context->max_b_frames = 2; >> > video_codec_context->gop_size= 12; >> > video_codec_context->global_quality= FF_QP2LAMBDA * 1; >> > video_codec_context->rc_initial_buffer_occupancy= 10695476; >> > video_codec_context->scenechange_threshold = 10; >> > video_codec_context->color_primaries= AVCOL_PRI_BT709; >> > video_codec_context->color_trc= AVCOL_TRC_BT709; >> > video_codec_context->qmin= 1; >> > video_codec_context->flags |= CODEC_FLAG_GLOBAL_HEADER | >> > CODEC