首页 > 解决方案 > FFmpeg:将视频/音频流循环到 YouTube Live

问题描述

我正在使用此脚本流式传输.mp4具有 2 分钟音轨的 30 秒视频文件,.mp3格式为:

#! /bin/bash

VBR="1500k"
FPS="30"
QUAL="ultrafast"
YOUTUBE_URL=" rtmp://a.rtmp.youtube.com/live2"
YOUTUBE_KEY="**********"
VIDEO_SOURCE="test_video_4.mp4"
AUDIO_SOURCE="test_audio_3.mp3"
AUDIO_ENCODER="aac"

ffmpeg \
 -stream_loop -1 \
 -re \
 -i "$VIDEO_SOURCE" \
 -thread_queue_size 512 \
 -i "$AUDIO_SOURCE" \
 -c:v libx264 -preset $QUAL -r $FPS -g $(($FPS *2)) -b:v $VBR \
 -c:a $AUDIO_ENCODER -threads 6 -ar 44100 -b:a 128k -bufsize 512k -pix_fmt yuv420p \
 -fflags +shortest -max_interleave_delta 50000 \
 -f flv $YOUTUBE_URL/$YOUTUBE_KEY

音频和视频都在第一次正确播放,视频在音频播放完成时循环播放(因为它更短)。唯一的问题是音频循环不起作用,一旦音频第一次完成,流就会停止。

这是日志:

ffmpeg 版本 4.3.1 版权所有 (c) 2000-2020
使用 Apple clang 版本 12.0.0 (clang-1200.0.32.27) 构建的 FFmpeg 开发人员
配置:--prefix=/usr/local/Cellar/ffmpeg/4.3。1_4 --enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls -- enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librubberband --enable-libsnappy --enable-libsrt -- enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid -- enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable -libspeex --enable-libsoxr --enable-videotoolbox --disable-libjack --disable-indev=jack libavutil 56. 51.100 / 56. 51.100 libavcodec 58. 91.100 / 58. 91.100 libavformat 58. 45.100 / 58. 45.100 libavdevice 58. 10.100 / 58. 10.100 libavfilter 7. 85.100 / 7. 85.100 libavresample 4. 0. 0 / 4. 0. 0 libswscale 5. 7.100 libswresample 5. 7.100 / 571 3. 7.100 / 3. 7.100 libpostproc 55. 7.100 / 55. 7.100 输入#0,mov,mp4,m4a,3gp,3g2,mj2,来自“test_video_4.mp4”:元数据:major_brand:mp42 minor_version:1 compatible_brands:isomp41mp42 creation_time : 2020-11-27T18:38:02.000000Z 持续时间: 00:00:39.46, 开始: 0.000000, 比特率: 12081 kb/s 流#0:0(und): 视频: h264 (高) (avc1 / 0x31637661), yuv420p(电视,bt709,渐进式),1280x720 [SAR 1:1 DAR 16:9],12033 kb/s,23.98 fps,23.98 tbr,24k tbn,48k tbc(默认)元数据:creation_time:2020-11-27T18: 38:02.000000Z handler_name:核心媒体视频输入#1,mp3,来自“test_audio_3.mp3”:元数据:流派:电影专辑:YouTube 音频库标题:测试标题艺术家:测试艺术家持续时间:00:02:12.21,开始:0.025057,比特率:320 kb/s 流 #1:0:音频: mp3, 44100 Hz, 立体声, fltp, 320 kb/s 元数据: 编码器 : LAME3.99r 流映射: Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264)) Stream #1 :0 -> #0:1 (mp3 (mp3float) -> aac (native)) 按 [q] 停止,[?] 寻求帮助 [libx264 @ 0x7fa825031600] 未指定 VBV maxrate,假设 CBR [libx264 @ 0x7fa825031600] 使用 SAR =1/1 [libx264 @ 0x7fa825031600] 使用 cpu 功能:MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2 [libx264 @ 0x7fa825031600] 配置文件约束基线,级别 3.1、4:2:0、8 位 [libx264 @0x7fa8250316] - 核心 161 r3027 4121277 - H.264/MPEG-4 AVC 编解码器 - Copyleft 2003-2020 -http://www.videolan.org/x264.html - 选项:cabac=0 ref=1 deblock=0:0:0 analyse=0:0 me=dia subme=0 psy=1 psy_rd=1.00:0.00 mixed_ref= 0 me_range=16 chroma_me=1 格子=0 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=0 线程=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 Bluray_compat=0 constrained_intra= 0 bframes=0 weightp=0 keyint=60 keyint_min=6 scenecut=0 intra_refresh=0 rc_lookahead=0 rc=cbr mbtree=0 bitrate=1500 ratetol=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 vbv_maxrate=1500 vbv_bufsize =512 nal_hrd=none 填充物=0 ip_ratio=1.40 aq=0 输出 #0,flv,到 'rtmp://a.rtmp.youtube.com/live2/*****':
[flv @ 0x7fa825032800] 无法使用正确的文件大小更新标头。帧= 3790 fps= 24 q=-1.0 Lsize= 24962kB 时间=00:02:38.03 比特率=1294.0kbits/s 速度=0.997x 视频:22719kB 音频:2081kB 字幕:0kB 其他流:0kB 全局标头:0kB 复用开销: 0.656017% [libx264 @ 0x7fa825031600] 帧 I:64 平均 QP:36.43 大小:38436 [libx264 @ 0x7fa825031600] 帧 P:3726 平均 QP:28.61 大小:5583 [libx264 @ 0x7fa80% I16031600] 10.mb 0.0% [libx264 @ 0x7fa825031600] mb P I16..4: 3.3% 0.0% 0.0% P16..4: 13.6% 0.0% 0.0% 0.0% 0.0% 跳过:83.1% [libx264 @ 0x7fa825031600] 编码 y,uvDC,uvAC内部:57.8% 71.6% 47.8% 内部:6.0% 7.1% 2.1% [libx264 @ 0x7fa825031600] i16 v,h,dc,p: 21% 39% 23% 18% [libx264 @ 0x7fa825031600] i8c dc,h,v, p:36% 38% 16% 10% [libx264 @ 0x7fa825031600] kb/s:1177.39 [aac @ 0x7fa82502d800] Qavg:179。

标签: ffmpegyoutubevideo-streaming

解决方案


也循环播放音频:

ffmpeg \
 -stream_loop -1 \
 -re \
 -i "$VIDEO_SOURCE" \
 -thread_queue_size 512 \
 -stream_loop -1 \
 -re \
 -i "$AUDIO_SOURCE" \
 -c:v libx264 -preset $QUAL -r $FPS -g $(($FPS *2)) -b:v $VBR -bufsize 3000k -maxrate $VBR \
 -c:a $AUDIO_ENCODER -ar 44100 -b:a 128k -pix_fmt yuv420p \
 -f flv $YOUTUBE_URL/$YOUTUBE_KEY
  • -fflags +shortest -max_interleave_delta 50000用于在最短输入结束时结束输出,但现在两个输入都无限循环,您不希望您的流停止。所以我删除了这些选项。

  • 修复了您的-bufsize并添加-maxrate以启用推荐用于流式传输的 VBV。有关该无处不在的脚本的一些一般性建议,请参阅此答案。

  • 已删除-threads。让编码器自动选择最佳值。


推荐阅读