我需要将 1h 捕获 udp 写入 http 流以将几个流写入文件,所有流写入一个硬盘,RAM 8Gb
bash脚本:
#!/bin/sh
ffmpeg -y -i http://192.168.1.36:7781/udp/232.0.3.12:1234 -c:a copy -ab 320k -loglevel verbose -vcodec libx264 -vf scale=320:240 -b 400k -t 3620 /data/A/stageA-$(date +"%H-day-%d").mkv
但 2-5 分钟后,3 个进程中有 2 个进程死亡。
>> logfile
没有生成日志数据,或者在使用创建的零大小文件时找不到它。
它是这样开始的:
ffmpeg version 3.4 Copyright (c) 2000-2017 the FFmpeg developers
built with FreeBSD clang version 4.0.0 (tags/RELEASE_400/final 297347) (based on LLVM 4.0.0)
configuration: --prefix=/usr/local --mandir=/usr/local/man --datadir=/usr/local/share/ffmpeg --pkgconfigdir=/usr/local/libdata/pkgconfig --enable-shared --enable-pic --enable-gpl --enable-postproc --enable-avfilter --enable-avresample --enable-pthreads --cc=cc --disable-alsa --disable-libopencore-amrnb --disable-libopencore-amrwb --disable-libass --disable-libbs2b --disable-libcaca --disable-libcdio --disable-libcelt --disable-chromaprint --disable-libdc1394 --disable-debug --disable-htmlpages --disable-libdrm --disable-libfdk-aac --enable-ffserver --disable-libflite --enable-fontconfig --enable-libfreetype --enable-frei0r --disable-libfribidi --disable-libgme --disable-libgsm --enable-iconv --disable-libilbc --disable-jack --disable-libkvazaar --disable-ladspa --disable-libmp3lame --disable-libbluray --disable-librsvg --disable-libxml2 --enable-mmx --disable-libmodplug --disable-openal --disable-opencl --enable-libopencv --disable-opengl --disable-libopenh264 --disable-libopenjpeg --enable-optimizations --disable-libopus --disable-libpulse --enable-runtime-cpudetect --disable-librubberband --disable-sdl2 --enable-libsmbclient --disable-libsnappy --disable-sndio --disable-libsoxr --disable-libspeex --enable-sse --disable-libssh --disable-libtesseract --enable-libtheora --disable-libtwolame --enable-libv4l2 --enable-vaapi --enable-vdpau --disable-libvidstab --enable-libvorbis --disable-libvo-amrwbenc --enable-libvpx --disable-libwavpack --disable-libwebp --enable-libx264 --enable-libx265 --disable-libxcb --enable-libxvid --disable-outdev=xv --disable-libzimg --disable-libzmq --disable-libzvbi --disable-gcrypt --enable-gmp --disable-librtmp --enable-gnutls --disable-openssl --enable-version3 --disable-nonfree --disable-libmysofa
libavutil 55. 78.100 / 55. 78.100
libavcodec 57.107.100 / 57.107.100
libavformat 57. 83.100 / 57. 83.100
libavdevice 57. 10.100 / 57. 10.100
libavfilter 6.107.100 / 6.107.100
libavresample 3. 7. 0 / 3. 7. 0
libswscale 4. 8.100 / 4. 8.100
libswresample 2. 9.100 / 2. 9.100
libpostproc 54. 7.100 / 54. 7.100
开始成功捕获,但,一段时间后,所有进程都会终止(除了一个进程)并显示控制台消息:
[mpegts @ 0x81744f000] max_analyze_duration 5000000 reached at 5016000 microseconds st:1
Input #0, mpegts, from 'http://192.168.1.36:7781/udp/232.0.3.12:1234':
Duration: N/A, start: 69081.872900, bitrate: 3692 kb/s
Program 2088
Metadata:
service_name : ?stageA SD
service_provider: ?DVB
Stream #0:0[0x23]: Video: mpeg2video (Main), 1 reference frame ([2][0][0][0] / 0x0002), yuv420p(tv, top first, left), 720x576 [SAR 64:45 DAR 16:9], 3500 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc
Stream #0:1[0x24]: Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, s16p, 192 kb/s
Please use -b:a or -b:v, -b is ambiguous
Stream mapping:
Stream #0:0 -> #0:0 (mpeg2video (native) -> h264 (libx264))
Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
[Parsed_scale_0 @ 0x81743e920] w:320 h:240 flags:'bicubic' interl:0
[graph 0 input from stream 0:0 @ 0x81743e9c0] w:720 h:576 pixfmt:yuv420p tb:1/90000 fr:25/1 sar:64/45 sws_param:flags=2
[Parsed_scale_0 @ 0x81743e920] w:720 h:576 fmt:yuv420p sar:64/45 -> w:320 h:240 fmt:yuv420p sar:4/3 flags:0x4
[libx264 @ 0x817418d00] using SAR=4/3
[libx264 @ 0x817418d00] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 AVX2 LZCNT BMI2
[libx264 @ 0x817418d00] profile High, level 1.3
[libx264 @ 0x817418d00] 264 - core 148 - H.264/MPEG-4 AVC codec - Copyleft 2003-2017 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=1 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=abr mbtree=1 bitrate=400 ratetol=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, matroska, to '/data/A/stageA-10-1-day-27.mkv':
Metadata:
encoder : Lavf57.83.100
Stream #0:0: Video: h264 (libx264), 1 reference frame (H264 / 0x34363248), yuv420p(left), 320x240 [SAR 4:3 DAR 16:9], q=-1--1, 400 kb/s, 25 fps, 1k tbn, 25 tbc
Metadata:
encoder : Lavc57.107.100 libx264
Side data:
cpb: bitrate max/min/avg: 0/0/400000 buffer size: 0 vbv_delay: -1
Stream #0:1: Audio: mp2 (P[0][0][0] / 0x0050), 48000 Hz, stereo, s16p, 320 kb/s
[http @ 0x81743e240] Stream ends prematurely at 141887172, should be 18446744073709551615.02x
[mpegts @ 0x81744f000] PES packet size mismatch
[mpeg2video @ 0x817417900] invalid cbp -1 at 15 10
[mpeg2video @ 0x817417900] Warning MVs not available
[mpeg2video @ 0x817417900] concealing 1170 DC, 1170 AC, 1170 MV errors in P frame
http://192.168.1.36:7781/udp/232.0.3.12:1234: Input/output error
No more output streams to write to, finishing.
frame= 6304 fps= 25 q=24.0 Lsize= 19010kB time=00:04:12.48 bitrate= 616.8kbits/s speed= 1x
video:12980kB audio:5912kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.627106%
Input file #0 (http://192.168.1.36:7781/udp/232.0.3.12:1234:
Input stream #0:0 (video): 6304 packets read (109239851 bytes); 6304 frames decoded;
Input stream #0:1 (audio): 10511 packets read (6053930 bytes);
Total: 16815 packets (115293781 bytes) demuxed
Output file #0 (/data/A/stageA-10-1-day-27.mkv):
Output stream #0:0 (video): 6304 frames encoded; 6304 packets muxed (13291122 bytes);
Output stream #0:1 (audio): 10511 packets muxed (6053930 bytes);
Total: 16815 packets (19345052 bytes) muxed
[libx264 @ 0x817418d00] frame I:45 Avg QP:16.15 size: 17155
[libx264 @ 0x817418d00] frame P:1685 Avg QP:18.85 size: 4913
[libx264 @ 0x817418d00] frame B:4574 Avg QP:22.07 size: 927
[libx264 @ 0x817418d00] consecutive B-frames: 2.1% 2.2% 3.5% 92.1%
[libx264 @ 0x817418d00] mb I I16..4: 4.6% 59.8% 35.6%
[libx264 @ 0x817418d00] mb P I16..4: 0.6% 5.7% 2.4% P16..4: 34.7% 31.7% 20.5% 0.0% 0.0% skip: 4.4%
[libx264 @ 0x817418d00] mb B I16..4: 0.1% 0.3% 0.2% B16..8: 44.5% 9.7% 2.6% direct: 3.5% skip:39.2% L0:37.5% L1:45.5% BI:17.0%
[libx264 @ 0x817418d00] final ratefactor: 18.42
[libx264 @ 0x817418d00] 8x8 transform intra:63.3% inter:65.0%
[libx264 @ 0x817418d00] coded y,uvDC,uvAC intra: 89.4% 92.5% 77.6% inter: 27.4% 27.8% 6.0%
[libx264 @ 0x817418d00] i16 v,h,dc,p: 33% 25% 4% 38%
[libx264 @ 0x817418d00] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 21% 19% 12% 5% 8% 10% 8% 9% 8%
[libx264 @ 0x817418d00] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 22% 20% 10% 6% 9% 10% 8% 8% 7%
[libx264 @ 0x817418d00] i8c dc,h,v,p: 48% 18% 24% 10%
[libx264 @ 0x817418d00] Weighted P-Frames: Y:5.9% UV:1.5%
[libx264 @ 0x817418d00] ref P L0: 54.2% 19.5% 17.9% 7.9% 0.5%
[libx264 @ 0x817418d00] ref B L0: 88.3% 9.2% 2.4%
[libx264 @ 0x817418d00] ref B L1: 94.4% 5.6%
[libx264 @ 0x817418d00] kb/s:421.38
任何人都可以建议我在这里做错了什么,或者建议我可以尝试解决这个问题吗?
答案1
与错误消息
[http @ 0x81743e240] Stream ends prematurely (…)
和
http://192.168.1.36:7781/udp/232.0.3.12:1234: Input/output error
显然网络或服务器不可靠。
您可以尝试告诉ffmpeg
继续重试,像这样调整您的命令(基于https://superuser.com/questions/1050481):
ffmpeg -y -reconnect 1 -reconnect_at_eof 1 -reconnect_streamed 1 -reconnect_delay_max 1 -i http://192.168.1.36:7781/udp/232.0.3.12:1234 -c:a copy -loglevel verbose -c:v libx264 -vf scale=320:240 -crf 23 -t 3620 /data/A/stageA-$(date +"%H-day-%d").mkv
或者,由于您的输入流是 MPEG 传输流,我建议使用专门用于该任务的工具传输数据,然后在第二步中转换视频。对于转让,wget
就curl
想到了。你可以尝试类似的东西
wget --tries=999 -O stream.ts http://192.168.1.36:7781/udp/232.0.3.12:1234
或者
while sleep 1
do
curl -sS http://192.168.1.36:7781/udp/232.0.3.12:1234 >> stream.ts
done
(基于https://stackoverflow.com/questions/21276570,https://stackoverflow.com/questions/40359012, 和https://stackoverflow.com/questions/31353244)。