使用FFMPEG将我的网络摄像头视频流到YouTube

5
我一直在尝试使用ffmpeg将我的网络摄像头的视频流式传输到YouTube,到目前为止,我只收到了来自YouTube的“开始”确认信息。然而,它很快就变成了灰色,实际的流从未离线。

我正在使用以下命令尝试进行流媒体传输:

ffmpeg -rtbufsize 1500M -r 25 -f dshow -s 1280x720 -i video="USB2.0 HD UVC WebCam" -vcodec h264 -b:a 600k -acodec libfaac -ab 128k -f flv "rtmp://a.rtmp.youtube.com/live2/user.useruser.codecodecode"

CMD

我已经成功地使用ffmpeg向YouTube流式传输视频,只是相机无法工作。您有什么错误的想法吗?

这是我现在使用的命令 ffmpeg -r 18 -f dshow -s 1280x720 -i video="USB2.0 HD UVC WebCam":audio="Microphone (Realtek High Definition Audio)" -vcodec h264 -b:v 1800k -acodec aac -strict experimental -f flv "rtmp://a.rtmp.youtube.com/live2/useruser.useruser.codecodecodecode"

现在我正在使用-acodec aac而不是libfaac或libfdk_aac,因为我一直收到“未知编码器”错误

它正在流式传输几秒钟,但现在我遇到了这些错误: WriteN、RTMP发送错误10053

您有什么想法,或如何修复它?

3个回答

4
如果您拥有具有全高清x264视频源的IP地址网络摄像头,没有音频,并且希望将您的直接摄像机屏幕流式传输到YouTube,则不需要始终对视频进行转码/重新编码以降低分辨率。 YouTube可以接受某些相机的直接视频流。唯一的问题是,您必须添加额外的空/静音音轨。如果您的网络带宽足够,则应该可以工作。
我正在Pine64+上使用此CLI命令,并且在Ubuntu 16.04上运行:
ffmpeg -re -rtsp_transport tcp -i "rtsp://<user>:<pass>@<camera_ip>:<port>" /
       -f lavfi -i anullsrc=channel_layout=stereo:sample_rate=44100 /
       -c:a libmp3lame -ab 128k -ar 44100 /
       -c:v copy -threads 2 -bufsize 512k /
       -f flv "rtmp://a.rtmp.youtube.com/live2/<your-live-stream-key>"

这是有关Libavfilter输入虚拟设备的一些信息:https://www.ffmpeg.org/ffmpeg-devices.html#lavfi。使用它,您可以将直接摄像头屏幕与无声音频转发到YouTube并最小化CPU使用。
一些限制:
1. 当您的网络连接中断时(例如您的ISP刷新网络、更改公共IP或路由器重新启动),ffmpeg将失去信号(网络摄像头和/或YouTube RTSP)。 2. 我看到有时YouTube停止接收流并将最后的数据转换为视频文件(存档流媒体视频),然后创建新的标识符进行直播。这会影响ffmpeg的操作(RTSP连接丢失),并影响您插入YouTube直播流代码的网页。(据我所知,YouTube仅处理不超过12小时的视频) 在这两种情况下,ffpmeg都无法检测到网络或流问题。因此,如果您想要流式传输永不停歇的内容,则很难正确自动化。
您需要以某种方式检测网络错误、检测YouTube何时停止侦听RTSP、检测如果ffmpeg与摄像机失去通信,最终需要以某种方式重新启动ffmpeg当所有服务再次正常工作时。
目前我正在临时使用一个小cron作业每小时重启ffmpeg。

谢谢分享,这对我很有用。在你的命令中,你使用正斜杠将命令分成多行,我需要用反斜杠替换它们才能成功运行命令。 - BdN3504

3

您的命令有几个问题:

  • 您没有音频流。使用 dshow 时,还需要像这里中解释的那样指定 audio

    ffmpeg -f dshow -i video="Integrated Camera":audio="Microphone name here"

    如果您不打算捕获音频,则可以放置一个静音音轨。

  • -b:a-ab 是相同的,都是音频比特率。您必须使用 -b:v 来指定视频比特率。对于 1280x720px @ 25fps 的 H.264 视频流,600k 太低了。

    YouTube 推荐:

    720p

    视频比特率范围:1,500 - 4,000 Kbps

    您应该至少设置为 1800k

  • 关于音频,您正在使用 libfaac。在编码 AAC 时,为了获得最佳结果,建议使用 libfdk_aac


谢谢,这很有帮助,但是现在开始流媒体后我一直收到“RTMP发送错误10053”的错误。你知道这是什么吗?(我已经更新了我的帖子,并附上了屏幕截图) - Indes
我也遇到了那个问题... - lulas
它可能意味着流被延迟直到丢弃。我在你的截图中看到低帧率。你的电脑能胜任这项任务吗? - aergistal
如果您不打算捕获音频,则请放置一个静音音轨。您想要确保视频文件中没有任何意外的声音干扰,因此在没有音频输入的情况下,放置一个静音音轨可以确保视频质量。 - Gyan
在我写这个答案时,YouTube直播接收点还期望有一个音频流。其次,在使用HLS时,如果没有音频流,播放可能会在苹果设备上失败,因为它们期望有混合的视频和音频(在旧版本的协议中)。请参考https://dev59.com/LZDea4cB1Zd3GeqPbm8z#33433528 - aergistal
@aergistal 我遇到了同样的问题,仅仅上传一个用javacv制作的视频到Youtube上。Youtube无法处理它。你最终使用了哪些音频和视频编解码器让它正常工作? - Para

1

使用FFmpeg将IP摄像机的实时视频流直播到Youtube - 针对Ubuntu用户(我所做的)

  1. Install latest ffmpeg on ubuntu 12.04 or 14.04 https://gist.github.com/xdamman/e4f713c8cd1a389a5917 and

  2. Compile FFmpeg on Ubuntu https://gist.github.com/faleev/3435377

  3. Open Youtube. Login. Click on My Channel > Video Manager > LIVE STREAMING . Note “Stream name/key” .

  4. For static video file:

    ffmpeg -re -i "(input-file)"  -acodec libmp3lame  -ar 44100 -b:a 128k -pix_fmt yuv420p -profile:v baseline -s 426x240 -bufsize 2048k -vb 400k -maxrate 800k -deinterlace -vcodec libx264 -preset medium -g 30 -r 30 -f flv "rtmp://a.rtmp.youtube.com/live2/(Stream name/key)"
    
  5. For streaming video from IP camera with rtsp video only output:

    ffmpeg -re -i input-file  -rtsp_transport tcp -i "rtsp://password@(streamaddress with local IP)"  -acodec libmp3lame  -ar 44100 -b:a 128k -pix_fmt yuv420p -profile:v baseline -s 426x240 -bufsize 2048k -vb 400k -maxrate 800k -deinterlace -vcodec libx264 -preset medium -g 30 -r 30 -f flv "rtmp://a.rtmp.youtube.com/live2/(Stream name/key)"
    

3
第5点中,输出结果是视频和音频。如何从IP相机向YouTube仅流传输视频(不含音频)?我尝试使用“-an”选项,但在YouTube上没有显示视频,尽管FFmpeg仍在运行。 - arsenalist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接