<div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><div>In my application , I used  ffmpeg to publish my camera and microphone 's av stream as rtmp stream to nginx server.</div><div>I use following code to publish stream:</div><div><pre style="margin-top: 0px; margin-bottom: 1em; padding: 5px; border: 0px; font-size: 13px; width: auto; max-height: 600px; overflow: auto; font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, sans-serif; word-wrap: normal; color: rgb(36, 39, 41); background-color: rgb(239, 240, 241);"><code style="margin: 0px; padding: 0px; border: 0px; font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, sans-serif; white-space: inherit;">void RtmpLiveEncoder::Run()
{
AVBitStreamFilterContext* aacbsfc =  av_bitstream_filter_init("aac_adtstoasc");
start_time = av_gettime();
while(1)
{
    do
    {
         int ret = 0;
         AVPacket pkt;
        av_init_packet(&pkt);
        ret = av_read_frame(ifmt_ctx,&pkt);
        if(ret<0 )
        {
            printf("read video frame failed\n");
            break;
        }


        if(pkt.pts==AV_NOPTS_VALUE)
        {
            if(_frameduration==0)
            {
                pkt.dts = pkt.pts=(av_gettime()-start_time)/1000;
            }
            else
            {
                pkt.dts = pkt.pts = _lastvideopts;
                pkt.duration = _frameduration;
                pkt.pos = -1;
                _lastvideopts += _frameduration;
            }

        }

        if(av_write_frame(ofmt_ctx,&pkt)<0)
        {
           printf("write video frame failed\n");
        }

        av_packet_unref(&pkt);
    }while(0);

    do
    {
        if(!_hasaudio)
        {
            break;
        }
        if((_lastaudiopts-_lastvideopts)>0)
        {
            printf("the audio is faster than video, the audio pts is %d, the video pts is %d\n",_lastaudiopts,_lastvideopts);
            break;
        }

        int ret = 0;
        AVPacket audiopacket;
        av_init_packet(&audiopacket);
        ret = av_read_frame(aifmt_ctx,&audiopacket);
        if(ret<0)
        {
          break;
        }

        AVStream* out_stream = ofmt_ctx->streams[1];
        if(av_bitstream_filter_filter(aacbsfc, out_stream->codec, NULL, &audiopacket.data, &audiopacket.size, audiopacket.data, audiopacket.size, 0)<0)
        {
            printf("remove adts header failed\n");
        }

        if(av_bitstream_filter_filter(aacbsfc, out_stream->codec, NULL, &audiopacket.buf->data, &audiopacket.buf->size, audiopacket.buf->data, audiopacket.buf->size, 0)<0)
        {
           printf("remove adts header failed\n");

        }

        audiopacket.stream_index=1;
        audiopacket.dts = audiopacket.pts=_lastaudiopts;
        audiopacket.duration = (double)1024/out_stream->codecpar->sample_rate*1000;
        _lastaudiopts += audiopacket.duration;
        audiopacket.pos = -1;


        if(av_write_frame(ofmt_ctx,&audiopacket)<0)
        {
            printf("write audio failed.\n");
        }

        av_packet_unref(&audiopacket);

    }while(0);

}</code></pre></div><div>I used vlc to access the hls stream, but after some minutes, the audio&video isn't sync any more.</div><div>How could I do?</div><div>THANKS IN ADVANCE!</div></div><br><br><span title="neteasefooter"><p> </p></span>