使用 FFMPEG 将我的网络摄像头视频流式传输到 YouTube
Using FFMPEG to stream my WebCam's video to YouTube
我一直在尝试使用 ffmpeg 将我的网络摄像头的视频流式传输到 YouTube,到目前为止,我所管理的只是来自 YouTube 的 "acknowledgement" 绿色的 'Starting'。然而,它很快变灰,实际流从未真正从离线状态改变。
我正在使用此命令尝试流式传输它:
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"
我已经成功地使用 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,因为我收到 "Unknown encoder" 错误
它正在流式传输几秒钟,但是现在我收到了这些错误:
WriteN, RTMP send error 10053
知道这些是什么意思,或者如何解决它们?
您的命令有一些问题:
您没有音频流。使用 dshow
时,您还需要按照 here.
的说明指定 audio
ffmpeg -f dshow -i video="Integrated Camera":audio="Microphone name here"
如果您不打算捕获音频,请放置静音音轨。
-b:a
与 -ab
相同 - 音频比特率。您必须使用 -b:v
指定视频比特率。 600k
对于 1280x720px @ 25fps H.264
视频流来说太低了。
YouTube recommends:
720p
Video Bitrate Range: 1,500 - 4,000 Kbps
你至少应该输入 1800k
.
关于您正在使用的音频libfaac
。为了在编码 AAC
时获得最佳结果,recommended 使用 libfdk_aac
使用 FFmpeg 将网络摄像机直播到 Youtube。 - 对于 Ubuntu 用户(我所做的)
在 ubuntu 12.04 或 14.04 https://gist.github.com/xdamman/e4f713c8cd1a389a5917 和
上安装最新的 ffmpeg
上编译 FFmpeg
打开 Youtube。登录。点击我的频道 > 视频管理器 > 直播。注意“流name/key”。
对于静态视频文件:
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)"
对于来自 IP 摄像机的流式传输视频,仅输出 rtsp 视频:
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)"
如果您的网络摄像头的 IP 地址具有全高清 x264 视频源,没有音频,并且您希望将您的直接摄像头屏幕流式传输到 YouTube,则不需要始终将视频 transcode/reencode 设置为较低分辨率. YouTube 可以接受一些相机的直接视频流。唯一的问题是您必须添加一个额外的 empty/silent 音轨。如果您的网络有足够的带宽,它应该可以工作。
我在 Ubuntu 16.04 的 Pine64+ 上使用此 CLI 命令,它正在运行:
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 使用率极低。
一些限制:
- 当您的网络出现故障时(例如您的 ISP 刷新网络、更改您的 public IP 或您的路由器重新启动)ffmpeg 将失去信号(网络摄像头 and/or YouTube RTSP)。
- 正如我所见,YouTube 有时会停止接收流媒体并将最后的数据转换为视频文件(存档流媒体视频),然后为直播流创建新的标识符。这会影响 ffmpeg 的操作(RTSP 连接丢失)并影响您插入 YouTube 直播代码的网页。
(因为我发现 YouTube 最多只能在一个片段中处理 12 小时的视频)。
在这两种情况下,ffpmeg 都无法检测到网络或流问题。因此,如果您想流式传输永无止境的流,则很难正确自动化。
- 您需要以某种方式检测网络错误。
- 您需要以某种方式检测 YouTube 何时停止收听 RTSP。
- 您需要以某种方式检测 ffmpeg 是否与相机失去通信。
- 最后,当所有服务再次运行时,您需要以某种方式重新启动 ffmpeg。
暂时我正在使用一个小的 cron 作业,每隔几个小时重新启动 ffmpeg。
我一直在尝试使用 ffmpeg 将我的网络摄像头的视频流式传输到 YouTube,到目前为止,我所管理的只是来自 YouTube 的 "acknowledgement" 绿色的 'Starting'。然而,它很快变灰,实际流从未真正从离线状态改变。
我正在使用此命令尝试流式传输它:
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"
我已经成功地使用 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,因为我收到 "Unknown encoder" 错误
它正在流式传输几秒钟,但是现在我收到了这些错误: WriteN, RTMP send error 10053
知道这些是什么意思,或者如何解决它们?
您的命令有一些问题:
您没有音频流。使用
的说明指定dshow
时,您还需要按照 here.audio
ffmpeg -f dshow -i video="Integrated Camera":audio="Microphone name here"
如果您不打算捕获音频,请放置静音音轨。
-b:a
与-ab
相同 - 音频比特率。您必须使用-b:v
指定视频比特率。600k
对于 1280x720px @ 25fpsH.264
视频流来说太低了。YouTube recommends:
720p
Video Bitrate Range: 1,500 - 4,000 Kbps
你至少应该输入
1800k
.关于您正在使用的音频
libfaac
。为了在编码AAC
时获得最佳结果,recommended 使用libfdk_aac
使用 FFmpeg 将网络摄像机直播到 Youtube。 - 对于 Ubuntu 用户(我所做的)
在 ubuntu 12.04 或 14.04 https://gist.github.com/xdamman/e4f713c8cd1a389a5917 和
上安装最新的 ffmpeg
- 上编译 FFmpeg
打开 Youtube。登录。点击我的频道 > 视频管理器 > 直播。注意“流name/key”。
对于静态视频文件:
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)"
对于来自 IP 摄像机的流式传输视频,仅输出 rtsp 视频:
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)"
如果您的网络摄像头的 IP 地址具有全高清 x264 视频源,没有音频,并且您希望将您的直接摄像头屏幕流式传输到 YouTube,则不需要始终将视频 transcode/reencode 设置为较低分辨率. YouTube 可以接受一些相机的直接视频流。唯一的问题是您必须添加一个额外的 empty/silent 音轨。如果您的网络有足够的带宽,它应该可以工作。
我在 Ubuntu 16.04 的 Pine64+ 上使用此 CLI 命令,它正在运行:
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 使用率极低。
一些限制:
- 当您的网络出现故障时(例如您的 ISP 刷新网络、更改您的 public IP 或您的路由器重新启动)ffmpeg 将失去信号(网络摄像头 and/or YouTube RTSP)。
- 正如我所见,YouTube 有时会停止接收流媒体并将最后的数据转换为视频文件(存档流媒体视频),然后为直播流创建新的标识符。这会影响 ffmpeg 的操作(RTSP 连接丢失)并影响您插入 YouTube 直播代码的网页。 (因为我发现 YouTube 最多只能在一个片段中处理 12 小时的视频)。
在这两种情况下,ffpmeg 都无法检测到网络或流问题。因此,如果您想流式传输永无止境的流,则很难正确自动化。
- 您需要以某种方式检测网络错误。
- 您需要以某种方式检测 YouTube 何时停止收听 RTSP。
- 您需要以某种方式检测 ffmpeg 是否与相机失去通信。
- 最后,当所有服务再次运行时,您需要以某种方式重新启动 ffmpeg。
暂时我正在使用一个小的 cron 作业,每隔几个小时重新启动 ffmpeg。