[FFmpeg-trac] #3107(undetermined:new): Problem using muxing example
FFmpeg
trac at avcodec.org
Fri Nov 15 20:47:07 CET 2013
#3107: Problem using muxing example
-------------------------------------+-------------------------------------
Reporter: ahsan | Owner:
Type: defect | Status: new
Priority: normal | Component:
Version: unspecified | undetermined
Keywords: | Resolution:
Blocking: | Blocked By:
Analyzed by developer: 0 | Reproduced by developer: 0
-------------------------------------+-------------------------------------
Comment (by easonic):
Replying to [comment:10 ahsan]:
> I merged, demux and mux example codes so that i can take in any
.mp4/.avi/mpg files and then re-encode them in the same format
>
> I am having following issues
>
> 1. MUX example code uses avformat_alloc_output_context2() to create the
output context for example for .mpg it will choose MPEG1 encoder, the .mpg
file i used is encoded using MPEG2 encoder.
>
> I was wondering how can i select different encoders, is there any API
call which i can use to re-set the encoder name in the context encoder
fails
>
> 2. I uses the fmt_ctx from decoder to set the encoder parameters, i try
to memcpy the context (decoder to encoder for the codec) but it fails by
setting the different parameters from fmt_ctx to the c
>
> c->width = fmt_ctx->streams[video_stream_idx]->codec->width;
> c->height = fmt_ctx->streams[video_stream_idx]->codec->height;
> c->coded_width = fmt_ctx->streams[video_stream_idx]->codec>coded_width;
> ........................
> c->gop_size = fmt_ctx->streams[video_stream_idx]->codec->gop_size;
> /* emit one intra frame every twelve frames at most */
>
> c->bit_rate = (fmt_ctx->streams[video_stream_idx]->codec->bit_rate == 0)
? 400000 :
> fmt_ctx->streams[video_stream_idx]->codec->bit_rate;
> /* i am seting it to 400kbps in case it is set to 0 as i am seeing it
for some stream */
>
> ........................
>
> I am seeing different issue
>
> 1. GOP Size fmt_ctx most of the time has gop_size = 12 which does not
seems like the case for the original/input stream
>
> 2. bit-rate i am getting in the output .mp4 is way higher then the one i
see from the fmt_ctx, it seems like encoded bit-stream is in 50Mbits/sec
where as input .mp4 was 300kbps or 400kbps bit-rate
>
> I am wondering what is the best way to set the encoder context using the
input bitstream
> [.mp4, .avi, .mpg etc] files
>
> Please let me know if you are able to figure it out
Hi, ahsan
Sorry for the delay, really busy for the project. Um, do you resolve that
issue? I met maybe the same problem here, what I did was just:
'''avcodec_copy_context(vStream->codec,
inFormatCtx->streams[video_idx]->codec);'''
but found that the '''output avformatcontext''' complains about the
codec_tag.
Thus, I traced the problem, found that after
'''avformat_write_header(outFmtCtx, NULL);''', some parameter in the
'''output avformatcontext->streams[video]->codec''' will change; thus I
set the parameter to zero before '''avformat_write_header(outFmtCtx,
NULL);''' and that works.
For my experiment, I found that to get the correct duration and time_base
(you can treat it as after parsing the codeccontext parameter), I need to
set videostream's codec to:
''/*
* IMPORTANT!!! Set the stream->codec information:
* Copy all the CodecFormat info except the time_base and codec_tag
* video_stream->codec->time_base: set to inputFmtCtx->vStream->time_base
* video only!
* video_stream->codec->codec_tag: calculate by av_write_header
* video_stream->codec->flags : set global if the output format need
* global
**/''
Um, and for audio, just skip the time_base part, and it works for me, too.
If you need my code (what I was doing was to remux files without
reencoding.), I will email to you later~
--
Ticket URL: <https://ffmpeg.org/trac/ffmpeg/ticket/3107#comment:11>
FFmpeg <http://ffmpeg.org>
FFmpeg issue tracker
More information about the FFmpeg-trac
mailing list