简体   繁体   English

av_interleaved_write_frame():通过peer mjpeg重置连接:mjpeg stream,ffserver和ffplay有什么问题?

[英]av_interleaved_write_frame(): Connection reset by peer mjpeg : What is wrong with mjpeg stream, ffserver and ffplay?

I'm creating mjpeg stream from image files using ffmpeg and write it to ffserver's feed: 我正在使用ffmpeg从图像文件创建mjpeg流并将其写入ffserver的feed:

sudo ffmpeg -loop 1 -i fon.jpeg -vcodec mjpeg -f mjpeg http://localhost:8090/feed1.ffm

ffmpeg version 2.0 Copyright (c) 2000-2013 the FFmpeg developers
built on Aug 19 2013 23:10:58 with gcc 4.7 (Debian 4.7.2-5)
configuration: 
libavutil      52. 38.100 / 52. 38.100
libavcodec     55. 18.102 / 55. 18.102
libavformat    55. 12.100 / 55. 12.100
libavdevice    55.  3.100 / 55.  3.100
libavfilter     3. 79.101 /  3. 79.101
libswscale      2.  3.100 /  2.  3.100
libswresample   0. 17.102 /  0. 17.102
Input #0, image2, from 'fon.jpeg':
Duration: 00:00:00.04, start: 0.000000, bitrate: N/A
Stream #0:0: Video: mjpeg, yuvj420p, 1280x720 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 25 tbn, 25 tbc
Output #0, mjpeg, to 'http://localhost:8090/feed1.ffm':
Metadata:
encoder         : Lavf55.12.100
Stream #0:0: Video: mjpeg, yuvj420p, 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 90k tbn, 25 tbc
Stream mapping:
Stream #0:0 -> #0:0 (mjpeg -> mjpeg)
Press [q] to stop, [?] for help

ffserver is configured as ffserver配置为

Port 8090
RTSPPort 8594
BindAddress 0.0.0.0
MaxClients 100
MaxBandwidth 20000
NoDaemon
<Feed feed.ffm>
File /tmp/feed.ffm
FileMaxSize 3M
</Feed>
<Stream test.rtsp>
Feed feed.ffm
Format rtsp
VideoCodec mjpeg
VideoFrameRate 30
VideoBufferSize 80000
VideoBitRate 200
VideoQMin 1
VideoQMax 5
VideoSize 1280x720
PreRoll 1
Noaudio
</Stream>
<Stream test.swf>
Feed feed.ffm
Format swf
VideoCodec flv
VideoFrameRate 30
VideoBufferSize 50000
VideoBitRate 100
VideoQMin 1
VideoQMax 5
VideoSize 1280x720
PreRoll 0
Noaudio
</Stream>

Then I'm trying to retrieve the rtsp stream from the ffserver: 然后我试图从ffserver检索rtsp流:

ffplay http://localhost:8090/test.rtsp -loglevel debug
avplay version 0.8.5-6:0.8.5-1, Copyright (c) 2003-2012 the Libav developers
built on Jan 13 2013 12:05:48 with gcc 4.7.2
configuration: --arch=amd64 --enable-pthreads --enable-runtime-cpudetect --extra-         version='6:0.8.5-1' --libdir=/usr/lib/x86_64-linux-gnu --prefix=/usr --enable-bzlib --enable-libdc1394 --enable-libdirac --enable-libfreetype --enable-frei0r --enable-gnutls --enable-libgsm --enable-libmp3lame --enable-librtmp --enable-libopencv --enable-libopenjpeg --enable-libpulse --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-vaapi --enable-vdpau --enable-libvorbis --enable-libvpx --enable-zlib --enable-gpl --enable-postproc --enable-swscale --enable-libcdio --enable-x11grab --enable-libx264 --enable-libxvid --shlibdir=/usr/lib/x86_64-linux-gnu --enable-shared --disable-static

avutil configuration: --arch=amd64 --enable-pthreads --enable-runtime-cpudetect --extra-version='6:0.8.4-1' --libdir=/usr/lib/x86_64-linux-gnu --prefix=/usr --enable-bzlib --enable-libdc1394 --enable-libdirac --enable-libfreetype --enable-frei0r --enable-gnutls --enable-libgsm --enable-libmp3lame --enable-librtmp --enable-libopencv --enable-libopenjpeg --enable-libpulse --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-vaapi --enable-vdpau --enable-libvorbis --enable-libvpx --enable-zlib --enable-gpl --enable-postproc --enable-swscale --enable-libcdio --enable-x11grab --enable-libx264 --enable-libxvid --shlibdir=/usr/lib/x86_64-linux-gnu --enable-shared --disable-static avcodec configuration: --arch=amd64 --enable-pthreads --enable-runtime-cpudetect --extra-version='6:0.8.4-1' --libdir=/usr/lib/x86_64-linux-gnu --prefix=/usr --enable-bzlib --enable-libdc1394 --enable-libdirac --enable-libfreetype --enable-frei0r --enable-gnutls --enable-libgsm --enable-libmp3lame - avutil配置: - arch = amd64 --enable-pthreads --enable-runtime-cpudetect --extra-version ='6:0.8.4-1'-libdir = / usr / lib / x86_64-linux-gnu - -prefix = / usr --enable-bzlib --enable-libdc1394 --enable-libdirac --enable-libfreetype --enable-frei0r --enable-gnutls --enable-libgsm --enable-libmp3lame --enable-librtmp --enable-libopencv --enable-libopenjpeg --enable-libpulse --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-vaapi --enable-vdpau --enable-libvorbis --enable-libvpx --enable-zlib --enable-gpl --enable-postproc --enable-swscale --enable-libcdio --enable-x11grab --enable-libx264 --enable-libxvid --shlibdir = / usr / lib / x86_64 -linux-gnu --enable-shared --disable-static avcodec配置: - arch = amd64 --enable-pthreads --enable-runtime-cpudetect --extra-version ='6:0.8.4-1' - -libdir = / usr / lib / x86_64-linux-gnu --prefix = / usr --enable-bzlib --enable-libdc1394 --enable-libdirac --enable-libfreetype --enable-frei0r --enable-gnutls - -enable-libgsm --enable-libmp3lame - -enable-librtmp --enable-libopencv --enable-libopenjpeg --enable-libpulse --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-vaapi --enable-vdpau --enable-libvorbis --enable-libvpx --enable-zlib --enable-gpl --enable-postproc --enable-swscale --enable-libcdio --enable-x11grab --enable-libx264 --enable-libxvid --shlibdir=/usr/lib/x86_64-linux-gnu --enable-shared --disable-static avformat configuration: --arch=amd64 --enable-pthreads --enable-runtime-cpudetect --extra-version='6:0.8.4-1' --libdir=/usr/lib/x86_64-linux-gnu --prefix=/usr --enable-bzlib --enable-libdc1394 --enable-libdirac --enable-libfreetype --enable-frei0r --enable-gnutls --enable-libgsm --enable-libmp3lame --enable-librtmp --enable-libopencv --enable-libopenjpeg --enable-libpulse --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-vaapi --enable-vdpau --enable-libvorbis --enable-libvpx --enable-zlib --enable-gpl --enable-postproc --enable-swscale --enable-libcdio --enable-x11grab - -enable-librtmp --enable-libopencv --enable-libopenjpeg --enable-libpulse --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-vaapi --enable-vdpau --enable-libvorbis - -enable-libvpx --enable-zlib --enable-gpl --enable-postproc --enable-swscale --enable-libcdio --enable-x11grab --enable-libx264 --enable-libxvid --shlibdir = / usr / lib / x86_64-linux-gnu --enable-shared --disable-static avformat configuration: - arch = amd64 --enable-pthreads --enable-runtime-cpudetect --extra-version ='6:0.8.4 -1' - libdir = / usr / lib / x86_64-linux-gnu --prefix = / usr --enable-bzlib --enable-libdc1394 --enable-libdirac --enable-libfreetype --enable-frei0r - enable-gnutls --enable-libgsm --enable-libmp3lame --enable-librtmp --enable-libopencv --enable-libopenjpeg --enable-libpulse --enable-libschroedinger --enable-libspeex --enable-libtheora - enable-vaapi --enable-vdpau --enable-libvorbis --enable-libvpx --enable-zlib --enable-gpl --enable-postproc --enable-swscale --enable-libcdio --enable-x11grab - -enable-libx264 --enable-libxvid --shlibdir=/usr/lib/x86_64-linux-gnu --enable-shared --disable-static swscale configuration: --arch=amd64 --enable-pthreads --enable-runtime-cpudetect --extra-version='6:0.8.4-1' --libdir=/usr/lib/x86_64-linux-gnu --prefix=/usr --enable-bzlib --enable-libdc1394 --enable-libdirac --enable-libfreetype --enable-frei0r --enable-gnutls --enable-libgsm --enable-libmp3lame --enable-librtmp --enable-libopencv --enable-libopenjpeg --enable-libpulse --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-vaapi --enable-vdpau --enable-libvorbis --enable-libvpx --enable-zlib --enable-gpl --enable-postproc --enable-swscale --enable-libcdio --enable-x11grab --enable-libx264 --enable-libxvid --shlibdir=/usr/lib/x86_64-linux-gnu --enable-shared --disable-static postproc configuration: --arch=amd64 --enable-pthreads --enable-runtime-cpudetect --extra-version='6:0.8.4-1' --libdir=/usr/lib/x86_64-linux-gnu --prefix=/usr --enable-bzlib --enable-libdc1394 --e -enable-libx264 --enable-libxvid --shlibdir = / usr / lib / x86_64-linux-gnu --enable-shared --disable-static swscale configuration: - arch = amd64 --enable-pthreads --enable- runtime-cpudetect --extra-version ='6:0.8.4-1' - libdir = / usr / lib / x86_64-linux-gnu --prefix = / usr --enable-bzlib --enable-libdc1394 - enable-libdirac --enable-libfreetype --enable-frei0r --enable-gnutls --enable-libgsm --enable-libmp3lame --enable-librtmp --enable-libopencv --enable-libopenjpeg --enable-libpulse - enable-libschroedinger --enable-libspeex --enable-libtheora --enable-vaapi --enable-vdpau --enable-libvorbis --enable-libvpx --enable-zlib --enable-gpl --enable-postproc - enable-swscale --enable-libcdio --enable-x11grab --enable-libx264 --enable-libxvid --shlibdir = / usr / lib / x86_64-linux-gnu --enable-shared --disable-static postproc configuration: --arch = amd64 --enable-pthreads --enable-runtime-cpudetect --extra-version ='6:0.8.4-1'-libdir = / usr / lib / x86_64-linux-gnu --prefix = / usr --enable-bzlib --enable-libdc1394 --e nable-libdirac --enable-libfreetype --enable-frei0r --enable-gnutls --enable-libgsm --enable-libmp3lame --enable-librtmp --enable-libopencv --enable-libopenjpeg --enable-libpulse --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-vaapi --enable-vdpau --enable-libvorbis --enable-libvpx --enable-zlib --enable-gpl --enable-postproc --enable-swscale --enable-libcdio --enable-x11grab --enable-libx264 --enable-libxvid --shlibdir=/usr/lib/x86_64-linux-gnu --enable-shared --disable-static nable-libdirac --enable-libfreetype --enable-frei0r --enable-gnutls --enable-libgsm --enable-libmp3lame --enable-librtmp --enable-libopencv --enable-libopenjpeg --enable-libpulse - enable-libschroedinger --enable-libspeex --enable-libtheora --enable-vaapi --enable-vdpau --enable-libvorbis --enable-libvpx --enable-zlib --enable-gpl --enable-postproc - enable-swscale --enable-libcdio --enable-x11grab --enable-libx264 --enable-libxvid --shlibdir = / usr / lib / x86_64-linux-gnu --enable-shared --disable-static

 libavutil    51. 22. 1 / 51. 22. 1
 libavcodec   53. 35. 0 / 53. 35. 0
 libavformat  53. 21. 1 / 53. 21. 0
 libavdevice  53.  2. 0 / 53.  2. 0
 libavfilter   2. 15. 0 /  2. 15. 0
 libswscale    2.  1. 0 /  2.  1. 0
 libpostproc  52.  0. 0 / 52.  0. 0
 http://localhost:8090/test.rtsp: Invalid data found when processing input

So, what is wrong in this streaming example, if I have no problem when I substitute streams to the files? 那么,这个流式传输示例有什么问题,如果我将流替换为文件时没有问题?

I create a mjpeg file using the same parameters 9i.e. 我使用相同的参数9i.e创建一个mjpeg文件。 file is an output insteadof stream) file是输出而不是stream)

sudo ffmpeg -loop 1 -i fon.jpeg -vcodec mjpeg -f mjpeg test.mjpg
ffmpeg version 2.0 Copyright (c) 2000-2013 the FFmpeg developers
built on Aug 19 2013 23:10:58 with gcc 4.7 (Debian 4.7.2-5)
configuration: 
libavutil      52. 38.100 / 52. 38.100
libavcodec     55. 18.102 / 55. 18.102
libavformat    55. 12.100 / 55. 12.100
libavdevice    55.  3.100 / 55.  3.100
libavfilter     3. 79.101 /  3. 79.101
libswscale      2.  3.100 /  2.  3.100
libswresample   0. 17.102 /  0. 17.102
Input #0, image2, from 'fon.jpeg':
Duration: 00:00:00.04, start: 0.000000, bitrate: N/A
Stream #0:0: Video: mjpeg, yuvj420p, 1280x720 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 25 tbn, 25 tbc
Output #0, mjpeg, to 'test.mjpg':
Metadata:
encoder         : Lavf55.12.100
Stream #0:0: Video: mjpeg, yuvj420p, 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 90k tbn, 25 tbc
Stream mapping:
Stream #0:0 -> #0:0 (mjpeg -> mjpeg)
Press [q] to stop, [?] for help
frame=   36 fps=0.0 q=0.0 size=     888kB time=00:00:01.36 bitrate=5349.2kbits/sframe=   78 fps= 76 q=0.0 size=    1711kB time=00:00:03.04 bitrate=4609.9kbits/sframe=  120 fps= 78 q=0.0 size=    2533kB time=00:00:04.72 bitrate=4396.9kbits/sframe=  161 fps= 79 q=0.0 size=    3336kB time=00:00:06.36 bitrate=4297.5kbits/sframe=  202 fps= 79 q=0.0 size=    4139kB       
time=00:00:08.00 bitrate=4238.8kbits/sframe=  243 fps= 79 q=0.0 size=    4943kB  
time=00:00:09.64 bitrate=4200.1kbits/sframe=  282 fps= 79 q=0.0 size=    5706kB 
time=00:00:11.20 bitrate=4173.9kbits/sframe=  321 fps= 79 q=0.0 size=    6470kB  
time=00:00:12.76 bitrate=4154.0kbits/sframe=  358 fps= 78 q=0.0 size=    7195kB 
time=00:00:14.24 bitrate=4139.2kbits/sframe=  397 fps= 68 q=0.0 size=    7959kB 
time=00:00:15.80 bitrate=4126.6kbits/s    
[1]+  Stopped sudo ffmpeg -loop 1 -i fon.jpeg -vcodec mjpeg -f mjpeg test.mjpg

And then I playback this mjpeg file with ffplay. 然后我用ffplay播放这个mjpeg文件。 The play back is correct, I see no errors or exceptions. 回放是正确的,我看到没有错误或例外。

ffplay test.mjpg
avplay version 0.8.5-6:0.8.5-1, Copyright (c) 2003-2012 the Libav developers
built on Jan 13 2013 12:05:48 with gcc 4.7.2
[mjpeg @ 0x7fc3680008c0] max_analyze_duration reached
[mjpeg @ 0x7fc3680008c0] Estimating duration from bitrate, this may be inaccurate
Input #0, mjpeg, from 'test.mjpg':
Duration: N/A, bitrate: N/A
Stream #0.0: Video: mjpeg, yuvj420p, 1280x720 [PAR 1:1 DAR 16:9], 25 fps, 25 tbr, 1200k tbn, 1200k tbc
[avsink @ 0x7fc360001020] auto-inserting filter 'auto-inserted scaler 0' between the filter 'src' and the filter 'out'
[scale @ 0x7fc360001700] w:1280 h:720 fmt:yuvj420p -> w:1280 h:720 fmt:yuv420p flags:0x4
27.99 A-V:  0.000 s:0.0 aq=    0KB vq=    0KB sq=    0B f=0/0   0/0

So, what is the configuration issue for ffserver, or may be it is a bug of the ffserver? 那么,ffserver的配置问题是什么,或者可能是ffserver的bug?

UPD. UPD。 I have realized, that i fed file1.ffm instead of file.ffm; 我意识到,我用file1.ffm代替file.ffm; that caused some ffserver problem: 这导致了一些ffserver问题:

 Mon Sep  9 11:43:20 2013 [ffm @ 0x2110000]Format ffm probed with size=2048 and score=101
 Mon Sep  9 11:43:20 2013 Deleting feed file 'feed1.ffm' as stream counts differ (1 != 2)
 Mon Sep  9 11:43:20 2013 [AVIOContext @ 0x210d660]Statistics: 4096 bytes read, 0 seeks
 Mon Sep  9 11:43:20 2013 [AVIOContext @ 0x210a9a0]Statistics: 0 seeks, 1 writeouts
 Mon Sep  9 11:43:20 2013 FFserver started.
 Mon Sep  9 11:44:18 2013 File '/feed1.ffm' not found
 Mon Sep  9 11:44:18 2013 127.0.0.1 - - [POST] "/feed1.ffm HTTP/1.1" 404 149

After i set a correct feed, i got another exception on ffmpeg side: 在我设置了正确的Feed之后,我在ffmpeg方面遇到了另一个例外:

sudo ffmpeg -loop 1 -i fon.jpeg -vcodec mjpeg -f mjpeg http://localhost:8090/feed.ffm
ffmpeg version 2.0 Copyright (c) 2000-2013 the FFmpeg developers
built on Aug 19 2013 23:10:58 with gcc 4.7 (Debian 4.7.2-5)
configuration: 
libavutil      52. 38.100 / 52. 38.100
libavcodec     55. 18.102 / 55. 18.102
libavformat    55. 12.100 / 55. 12.100
libavdevice    55.  3.100 / 55.  3.100
libavfilter     3. 79.101 /  3. 79.101
libswscale      2.  3.100 /  2.  3.100
libswresample   0. 17.102 /  0. 17.102
Input #0, image2, from 'fon.jpeg':
Duration: 00:00:00.04, start: 0.000000, bitrate: N/A
Stream #0:0: Video: mjpeg, yuvj420p, 1280x720 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 25 tbn, 25 tbc
Output #0, mjpeg, to 'http://localhost:8090/feed.ffm':
Metadata:
encoder         : Lavf55.12.100
Stream #0:0: Video: mjpeg, yuvj420p, 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 90k tbn, 25 tbc
Stream mapping:
Stream #0:0 -> #0:0 (mjpeg -> mjpeg)
Press [q] to stop, [?] for help
av_interleaved_write_frame(): Connection reset by peer

While ffserver shows no error at all: 虽然ffserver完全没有显示错误:

sudo ffserver -f  /etc/ffserver3.conf
ffserver version 2.0 Copyright (c) 2000-2013 the FFmpeg developers
built on Aug 19 2013 23:10:58 with gcc 4.7 (Debian 4.7.2-5)
configuration: 
libavutil      52. 38.100 / 52. 38.100
libavcodec     55. 18.102 / 55. 18.102
libavformat    55. 12.100 / 55. 12.100
libavdevice    55.  3.100 / 55.  3.100
libavfilter     3. 79.101 /  3. 79.101
libswscale      2.  3.100 /  2.  3.100
libswresample   0. 17.102 /  0. 17.102
Mon Sep  9 12:08:19 2013 FFserver started.
Mon Sep  9 12:08:40 2013 127.0.0.1 - - [POST] "/feed.ffm HTTP/1.1" 200 4096
Mon Sep  9 12:12:28 2013 127.0.0.1 - - [GET] "/ HTTP/1.1" 200 1847

So, what is the problem now? 那么,现在的问题是什么?

the short answer is: you can't do that, at least not in that way. 简短的回答是:你不能这样做,至少不是那样。 ffserver decides the expected input format by looking at the feed output name. ffserver通过查看feed输出名称来决定预期的输入格式。 when it sees you sending the data to feed.ffm it assumes ffm data, and so when libavformat/utils.c routine avformat_open_input calls s->iformat->read_header(s) , it uses the ffm_read_header routine in libavformat/ffmdec.c : 当它看到你将数据发送到feed.ffm它会假定ffm数据,所以当libavformat/utils.c例程avformat_open_input调用s->iformat->read_header(s) ,它使用libavformat/ffmdec.cffm_read_header例程:

 /* header */
 tag = avio_rl32(pb);
 if (tag == MKTAG('F', 'F', 'M', '2'))
     return ffm2_read_header(s);
 if (tag != MKTAG('F', 'F', 'M', '1')) {
     ret = AVERROR_INVALIDDATA;
     goto fail;
 }

here is where it sees the <ff><d8><ff><e0> at the beginning of the JPEG data, sees it is not equal to FFM2 or FFM1 , and fails with "Invalid data found when processing input", although that message is never shown. 这里是它看到JPEG数据开头的<ff><d8><ff><e0> ,看到它不等于FFM2FFM1 ,并且失败并显示“处理输入时发现无效数据”,尽管如此消息永远不会显示。

I can't yet tell you the right way to do it, but at least now you know what is happening. 我还不能告诉你正确的方法,但至少现在你知道发生了什么。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM