[Libav-user] [FFmpeg-user] Live transcoding to an rtp stream is unreliable.
David Pottage
david at electric-spoon.com
Thu Apr 7 14:41:28 CEST 2011
On 07/04/11 12:39, Alexandre Ferrieux wrote:
> On 07/04/2011 13:14, David Pottage wrote:
>> Hello
>>
>> I am attempting to transcode and re-stream a live TV channel using
>> ffmpeg under linux. My command line is:
>>
>> ffmpeg -loglevel verbose \
>> -pix_fmt yuv422p -s 720x576 -i http://david-laptop:8000/4228 \
>> -vn -sn -acodec libfaac -ar 48000 -ab 64000 -ac 2 -async 1 -flags
>> +global_header -f rtp rtp://david-laptop:9022 \
>> -an -sn -vcodec libx264 -s 320x240 -fpre
>> resources/ffpreset/libx264-hq.ffpreset \
>> -fpre resources/ffpreset/libx264-ipod320.ffpreset -vglobal 1 -f rtp
>> rtp://david-laptop:9020 -newvideo
>>
>> In the command line above, http://david-laptop:8000/4228 is connected to
>> a DVB capture card, and streams a raw DVB transport stream of a live TV
>> channel.
>>
>> The outgoing stream is sent as two seperate elementary streams (audio
>> and video) over rtp.
>>
>> My problem is that the streaming process is very unreliable. ffmpeg will
>> often hang on start-up, (before it emits the SDP file), or it will
>> start-up normally, but then crash after about a second of transcoding.
>>
>> The reliablity appears to depend on the uptime of the machine, and the
>> number of times it has run before. It usually works if it is the first
>> time that ffmpeg is invoked after a reboot, but becomes less reliable
>> after that.
>>
>> I have tried varying the network port numbers of the outgoing streams in
>> case something is not being cleaned up, but it does not make any
>> difference.
>>
>> Has anyone experienced any symptoms like that. Can anyone suggest what
>> might be going on, or give me any clues for further investigation.
>
> First, give the ffmpeg output (giving the version, detected container
> and codec, stream mapping etc.).
Here:
> FFmpeg version 0.6.1, Copyright (c) 2000-2010 the FFmpeg developers
> built on Apr 4 2011 16:31:39 with gcc 4.4.3
> configuration: --enable-postproc --extra-ldflags=-static
> --extra-libs='-lvorbis -logg -lxvidcore -lx264 -lopencore-amrnb
> -lopencore-amrwb -lfaad -lfaac -lm -lpthread' --enable-gpl
> --enable-libfaac --enable-libmp3lame --enable-libopencore-amrnb
> --enable-libopencore-amrwb --enable-libvorbis --enable-libx264
> --enable-libxvid --enable-nonfree --enable-shared --enable-version3
> --enable-libfaad --enable-small --disable-ffplay --disable-ffserver
> --disable-doc
> libavutil 50.15. 1 / 50.15. 1
> libavcodec 52.72. 2 / 52.72. 2
> libavformat 52.64. 2 / 52.64. 2
> libavdevice 52. 2. 0 / 52. 2. 0
> libswscale 0.11. 0 / 0.11. 0
> libpostproc 51. 2. 0 / 51. 2. 0
> [mpeg2video @ 0x9943990]mpeg_decode_postinit() failure
> Last message repeated 13 times
> [mpegts @ 0x993dae0]max_analyze_duration reached
> [mpegts @ 0x993dae0]Estimating duration from bitrate, this may be
> inaccurate
> Input #0, mpegts, from 'http://10.10.10.10:8000/4228':
> Duration: N/A, start: 55166.391433, bitrate: 15256 kb/s
> Program 4228
> Stream #0.0[0x262]: Video: mpeg2video, yuv420p, 720x576 [PAR 64:45
> DAR 16:9], 15000 kb/s, 27.63 fps, 25 tbr, 90k tbn, 50 tbc
> Stream #0.1[0x263](eng): Audio: mp2, 48000 Hz, 2 channels, s16,
> 256 kb/s
> Stream #0.2[0x264](eng): Audio: mp3, 0 channels, s16
> Stream #0.3[0x267](eng): Subtitle: dvbsub
> Stream #0.4[0x26b]: Data: 0x0005
> Stream #0.5[0x3f0]: Data: 0x000b
> Stream #0.6[0x3f1]: Data: 0x000b
> Stream #0.7[0x3f2]: Data: 0x000b
> Stream #0.8[0x28a]: Data: 0x000b
> Stream #0.9[0x28b]: Data: 0x000b
> Stream #0.10[0x28c]: Data: 0x000b
> [libx264 @ 0x99fe790]using SAR=4/3
> [libx264 @ 0x99fe790]VBV buffer (3000) > level limit (2000)
> [libx264 @ 0x99fe790]using cpu capabilities: MMX2 SSE2 SSE3 Cache64
> [libx264 @ 0x99fe790]profile Constrained Baseline, level 1.3
> [libx264 @ 0x99fe790]264 - core 114 r1913 5fd3dce - H.264/MPEG-4 AVC
> codec - Copyleft 2003-2011 - http://www.videolan.org/x264.html -
> options: cabac=0 ref=4 deblock=1:0:0 analyse=0x1:0x111 me=umh subme=8
> psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1
> 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2
> threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0
> constrained_intra=0 bframes=0 weightp=0 keyint=250 keyint_min=25
> scenecut=40 intra_refresh=0 rc_lookahead=40 rc=abr mbtree=1
> bitrate=200 ratetol=20.0 qcomp=0.60 qpmin=10 qpmax=51 qpstep=4
> vbv_maxrate=768 vbv_bufsize=3000 nal_hrd=none ip_ratio=1.41 aq=1:1.00
When it is not working, ffmpeg usualy stops at that point and produces
no more output until I kill it with ^C
Sometimes it gets as far as emmiting the stream mappings & SDP file. I
then get:
> Output #0, rtp, to 'rtp://david-laptop:8062':
> Metadata:
> encoder : Lavf52.64.2
> Stream #0.0(eng): Audio: libfaac, 48000 Hz, 2 channels, s16, 64 kb/s
> Output #1, rtp, to 'rtp://david-laptop:8060':
> Metadata:
> encoder : Lavf52.64.2
> Stream #1.0: Video: libx264, yuv420p, 320x240 [PAR 4:3 DAR 16:9],
> q=10-51, 200 kb/s, 90k tbn, 25 tbc
> Stream mapping:
> Stream #0.1 -> #0.0
> Stream #0.0 -> #1.0
> SDP:
> v=0
> o=- 0 0 IN IP4 127.0.0.1
> s=No Name
> t=0 0
> a=tool:libavformat 52.64.2
> m=audio 8062 RTP/AVP 97
> c=IN IP4 10.2.2.43
> b=AS:64
> a=rtpmap:97 MPEG4-GENERIC/48000/2
> a=fmtp:97
> profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3;
> config=1190
> m=video 8060 RTP/AVP 96
> c=IN IP4 10.2.2.43
> b=AS:200
> a=rtpmap:96 H264/90000
> a=fmtp:96 packetization-mode=1;
> sprop-parameter-sets=Z0LADdlBQfsOEAAAAwAQAAADAyDxQqWA,aMkjLIA=
>
> Press [q] to stop encoding
> [mpeg2video @ 0xa193990]warning: first frame is no keyframe
> [mpeg2video @ 0xa193990]ac-tex damaged at 11 22=4.52 bitrate=
> 73.2kbits/s dup=12 drop=0
> [mpeg2video @ 0xa193990]Warning MVs not available
> [mpeg2video @ 0xa193990]concealing 630 DC, 630 AC, 630 MV errors
> [mp2 @ 0xa1940f0]incomplete frame
> Error while decoding stream #0.1
> frame= 161 fps= 88 q=25.0 Lsize= 43kB time=5.48 bitrate=
> 64.3kbits/s dup=12 drop=0
> video:70kB audio:43kB global headers:0kB muxing overhead -61.776752%
> [libx264 @ 0xa1e8ac0]frame I:2 Avg QP:35.11 size: 1170
> [libx264 @ 0xa1e8ac0]frame P:159 Avg QP:24.71 size: 430
> [libx264 @ 0xa1e8ac0]mb I I16..4: 81.2% 0.0% 18.8%
> [libx264 @ 0xa1e8ac0]mb P I16..4: 0.6% 0.0% 1.3% P16..4: 12.2%
> 2.3% 1.0% 0.0% 0.0% skip:82.5%
> [libx264 @ 0xa1e8ac0]final ratefactor: 19.82
> [libx264 @ 0xa1e8ac0]coded y,uvDC,uvAC intra: 43.6% 51.2% 36.3% inter:
> 3.6% 8.9% 1.7%
> [libx264 @ 0xa1e8ac0]i16 v,h,dc,p: 55% 26% 3% 16%
> [libx264 @ 0xa1e8ac0]i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 21% 21% 15% 6%
> 7% 9% 8% 7% 6%
> [libx264 @ 0xa1e8ac0]i8c dc,h,v,p: 60% 23% 13% 4%
> [libx264 @ 0xa1e8ac0]ref P L0: 79.4% 11.9% 6.7% 2.0%
> [libx264 @ 0xa1e8ac0]kb/s:87.93
It only does transcoding for about a second before it stop working, and
quits.
> Second, better characterize "crashes": open the corefile with gdb and
> give the stack of every thread.
I should have been more clear. It is not crashing in the sense of a seg
fault and core dump. It is just stopping unexpectedly. There is no core
dump, it is just not producing anything useful.
> Also, I'd try to decorrelate
> depayloading/decoding/encoding/repayloading, and see which (if any)
> crashes. To do so, use several ffmpeg processes connected by pipes,
> and -[av]codec copy (and explicit -f values).
OK, I will try that. What container format do you recommend for the
pipes? In the past I have tried yuv4mpegpipe, but found it unstable as
it only works for video, not audio, so I used matroska. Is that a good
choice? Is there another container format that is good for raw streams.
--
David Pottage
More information about the Libav-user
mailing list