[Libav-user] Troubles with transcoding

Hannes Wuerfel hannes.wuerfel at student.hpi.uni-potsdam.de
Thu Nov 22 23:25:16 CET 2012


Am 22.11.2012 04:32, schrieb hatred:
> Hi, Hannes!
>
> My comments below. Worked code also.
>
> 2012/11/21 Hannes Wuerfel <hannes.wuerfel at student.hpi.uni-potsdam.de 
> <mailto:hannes.wuerfel at student.hpi.uni-potsdam.de>>
>
>     Am 21.11.2012 07:42, schrieb hatred:
>
>     In my case, I'd like to manipulate video frames of the file with
>     some image processing kernels etc. and write the file with the
>     same codecs they have back to disc, but of cause with processed
>     frames.
>     So basically I need a "transcoder" from the codec to the same codec.
>
>     What I didn't have is your code fragment:
>     "if (outCtx.videoCodecCtx->coded_frame->pts != AV_NOPTS_VALUE)
>     {
>                             outPkt.pts =
>     av_rescale_q(outCtx.videoCodecCtx->coded_frame->pts,
>     outCtx.videoCodecCtx->time_base,
>     outCtx.videoStream->time_base);
>     }"
>
>
> In common way Stream time base and CodecContext time base is not 
> equal, but regard comments in AVPacket structure pts field must be in 
> Stream time base units and I rescale it before muxing
>
>
>     If I put it into my code almost all or no video frames are encoded
>     succesfully and the output is:
>     [libx264 @ 0000000002620080] specified frame type (3) at 1314 is
>     not compatible with keyframe interval
>     [mp4 @ 00000000034ff080] pts (0) < dts (1352000) in stream 0
>     Error while writing video frame
>
>
> It is my error: we should rescale dts field also if it is not equal to 
> AV_NOPTS.
>
>     I looked into ffmpeg.c as well but I had no time to step threw it
>     while transcoding, because I'm currently working on a windows machine.
>      Perhaps you can explane to me why we have to rescale the
>     presentation time stamp...
>
>
> See comments above. For encoding we can set same time base to stream 
> and codec context and remove pts/dts rescaling.
>
>     Ah and you've rescaled the audio too. I did not rescale the audio
>     but for every input codec I take, audio is always fine, even withouth:
>
>     "if (frame->pts == AV_NOPTS_VALUE)
>     {
>                         AVRational samplesRateInv = {1,
>     outCtx.audioCodecCtx->sample_rate};
>     int64_t pts = inputAudioSamples;
>                         frame->pts = av_rescale_q(pts, samplesRateInv,
>     inCtx.audioCodecCtx->time_base);
>     }
>                     inputAudioSamples += frame->nb_samples;"
>
>      Why is this?
>
>
> This part of code is root couse of trouble with sound encoding and 
> muxing. After deconding audio samples pts value always equal to 
> AV_NOPTS_VALUE, so I tried to calculate real value using sample_rate 
> value and decoded samples count. But I suppose that muxer don't want 
> valid pts values for audio packets it want NOPTS value for correct muxing.
>
> Worked code: http://pastebin.com/zYTiuRyA
>
> But I also have some amount of questions:
> 1. How to correctly resample audio frames if input and output streams 
> have different Sample Format, Sample Rate, Channels Count, Channels 
> Layout or Frame Size? Example wanted...
> 2. How to correctly synchronize audio and video? In some cases in 
> transcoded file video and sound not synchronized and I don't 
> understand - why?
Good job man. This works for perfectly for me. But I discovered the same 
when transcoding from some codec to another.
Now there is only one thing different in my code.
As in the demuxing.c example I'm using something like this after the 
trancoding loop to flush the remaining cached frames:
/* flush cached frames */
     pkt.data = NULL;
     pkt.size = 0;
     do {
         decode_packet(&got_frame, 1);
     } while (got_frame);

Perhaps this could help for your synchronization problem of cached frames?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://ffmpeg.org/pipermail/libav-user/attachments/20121122/ebad0138/attachment.html>


More information about the Libav-user mailing list