[Libav-user] Troubles with transcoding
Hannes Wuerfel
hannes.wuerfel at student.hpi.uni-potsdam.de
Wed Nov 21 12:25:27 CET 2012
Am 21.11.2012 07:42, schrieb hatred:
> Hi List!
>
> I have FFMPEG 1.0 installed in my ArchLinux box, I try to write simple
> audio+video transcoder example using existings doc/examples/muxing.c
> and doc/examples/demuxing.c ones and I have trouble: I can't listen
> sound in resulting file.
>
> Source example with command line to compile: http://pastebin.com/F9R5qpPz
> Compile:
> g++ -Wall -O2 -g -D__STDC_CONSTANT_MACROS -o
> video-sound-transcoding-test video-sound-transcoding-test.cpp -lm
> -lavdevice -lavformat -lavfilter -lavcodec -lswresample -lswscale -lavutil
>
> run:
> ./video-sound-transcoding-test input_file.avi out.ts
>
> I test only for MPEGTS output as more needed for me.
>
> Other info:
> 1. If input file contain only sound stream transcoding finished
> successfuly and I can listen sound in resulting file well.
> 2. If I comment code and skip video stream in input file transcoding
> finished successfuly also and I can listen sound in resulting file well.
> 3. Video transcoded very well
> 4. transcoding with ffmpeg is valid: ffmpeg -i input_file.avi -f
> mpegts out.ts but I don't fully understand its code.
>
> So I don't understand how to correctly I must encode/muxing
> audio+video and all suggestions is welcome!
>
> Thank for every answer, List!
Hi,
it seems that you are stucked the same way that I do for several days.
I really don't want to take over your thread but I seems to me that we
are both almost in front of the last barrier.
I've got almost the same code as you (merged together from demuxing.c
and muxing.c).
So perhaps with the help of some advanced ffmpeg user/developer on the
list we can figure out our problem.
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);
}"
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
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...
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?
More information about the Libav-user
mailing list