[Libav-user] FFmpeg transcoded sound (AAC) stops after half video time
Jan Drabner
jan at jdrabner.eu
Thu Aug 13 10:04:17 CEST 2015
Am 8/13/2015 um 9:47 AM schrieb Jan Drabner:
> (This is the same post I made on Stackoverflow:
> http://stackoverflow.com/questions/31968745/ffmpeg-transcoded-sound-aac-stops-after-half-video-time
> )
>
> I have a strange problem in my C/C++ FFmpeg transcoder, which takes an
> input MP4 (varying input codecs) and produces and output MP4 (x264,
> baseline & AAC LC @44100 sample rate with libfdk_aac):
>
> The resulting mp4 video has fine images (x264) and the audio (AAC LC)
> works fine as well, but is only played until exactly the half of the
> video.
> The audio is not slowed down, not stretched and doesn't stutter. It
> just stops right in the middle of the video.
>
> One hint may be that the input file has a sample rate of 22050 and
> 44100/22050 is 0.5, but I really don't get why this would make the
> sound just stop. I'd expect such an error leading to sound being at
> the wrong speed. Everything works just fine if I don't try to enforce
> 44100 and instead just use the incoming sample_rate.
>
> Another guess would be that the pts calculation doesn't work. But the
> audio sounds just fine (until it stops) and I do exactly the same for
> the video part, where it works flawlessly. "Exactly", as in the same
> code, but "audio"-variables replaced with "video"-variables.
>
> FFmpeg reports no errors during the whole process. I also flush the
> decoders/encoders/interleaved_writing after all the package reading
> from the input is done. It works well for the video so I doubt there
> is much wrong with my general approach.
>
> Here are the functions of my code (stripped off the error handling &
> other class stuff):
>
> AudioCodecContext Setup
>
> |outContext->_audioCodec
> =avcodec_find_encoder(outContext->_audioTargetCodecID);outContext->_audioStream
> =avformat_new_stream(outContext->_formatContext,outContext->_audioCodec);outContext->_audioCodecContext
> =outContext->_audioStream->codec;outContext->_audioCodecContext->channels
> =2;outContext->_audioCodecContext->channel_layout
> =av_get_default_channel_layout(2);outContext->_audioCodecContext->sample_rate
> =44100;outContext->_audioCodecContext->sample_fmt
> =outContext->_audioCodec->sample_fmts[0];outContext->_audioCodecContext->bit_rate
> =128000;outContext->_audioCodecContext->strict_std_compliance
> =FF_COMPLIANCE_EXPERIMENTAL;outContext->_audioCodecContext->time_base
> =(AVRational){1,outContext->_audioCodecContext->sample_rate};outContext->_audioStream->time_base
> =(AVRational){1,outContext->_audioCodecContext->sample_rate};intretVal
> =avcodec_open2(outContext->_audioCodecContext,outContext->_audioCodec,NULL);
> |
>
> Resampler Setup
>
> |outContext->_audioResamplerContext
> =swr_alloc_set_opts(NULL,outContext->_audioCodecContext->channel_layout,outContext->_audioCodecContext->sample_fmt,outContext->_audioCodecContext->sample_rate,_inputContext._audioCodecContext->channel_layout,_inputContext._audioCodecContext->sample_fmt,_inputContext._audioCodecContext->sample_rate,0,NULL);intretVal
> =swr_init(outContext->_audioResamplerContext); |
>
> Decoding
>
> |decodedBytes
> =avcodec_decode_audio4(_inputContext._audioCodecContext,_inputContext._audioTempFrame,&p_gotAudioFrame,&_inputContext._currentPacket);
> |
>
> Converting (only if decoding produced a frame, of course)
>
> |intretVal
> =swr_convert(outContext->_audioResamplerContext,outContext->_audioConvertedFrame->data,outContext->_audioConvertedFrame->nb_samples,(constuint8_t**)_inputContext._audioTempFrame->data,_inputContext._audioTempFrame->nb_samples);
> |
>
> Encoding (only if decoding produced a frame, of course)
>
> |outContext->_audioConvertedFrame->pts
> =av_frame_get_best_effort_timestamp(_inputContext._audioTempFrame);//
> Init the new
> packetav_init_packet(&outContext->_audioPacket);outContext->_audioPacket.data
> =NULL;outContext->_audioPacket.size =0;// EncodeintretVal
> =avcodec_encode_audio2(outContext->_audioCodecContext,&outContext->_audioPacket,outContext->_audioConvertedFrame,&p_gotPacket);//
> Set pts/dts time stamps for writing
> interleavedav_packet_rescale_ts(&outContext->_audioPacket,outContext->_audioCodecContext->time_base,outContext->_audioStream->time_base);outContext->_audioPacket.stream_index
> =outContext->_audioStream->index; |
>
> Writing (only if encoding produced a packet, of course)
>
> |intretVal
> =av_interleaved_write_frame(outContext->_formatContext,&outContext->_audioPacket);
> |
>
> I am quite out of ideas about what would cause such a behaviour.
>
>
Obviously, I meant that 22050/44100 is 0.5 ;)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://ffmpeg.org/pipermail/libav-user/attachments/20150813/8794159c/attachment.html>
More information about the Libav-user
mailing list