标签: video-streaming

FFMPEG RTMP流录制超时

[已解决] - 最终编辑中的解决方案我正在使用 ffmpeg 录制 rtmp 直播流,并希望添加一个标志,该标志将在新数据停止到达时自动停止处理。

如果我启动和停止脚本(通过按需终止进程来停止),一切都很好,录音将被保存并可以播放。但是,当在没有手动调用 STOP 的情况下从源停止流时,脚本仍将运行一段时间,并且生成的文件将被损坏(使用手动停止调用进行测试 - 有效,并在录制之前停止流,模拟浏览器/选项卡关闭或断开连接 - 失败)

我正在运行的命令

$command = "ffmpeg -i {$rtmpUrl} -c:v copy -c:a copy -t 3600 {$path} >/dev/null  2>/dev/null &";
$res = shell_exec($command)
Run Code Online (Sandbox Code Playgroud)

我尝试在输入之前和之后添加 -timeout 0 选项,如下所示

$command = "ffmpeg -timeout 0 -i {$rtmpUrl} -c:v copy -c:a copy -t 3600 {$path} >/dev/null  2>/dev/null &"; 
Run Code Online (Sandbox Code Playgroud)

$command = "ffmpeg -i {$rtmpUrl} -c:v copy -c:a copy -timeout 0 -t 3600 {$path} >/dev/null  2>/dev/null &";
Run Code Online (Sandbox Code Playgroud)

但没有任何改善。

我在这里缺少什么?当新数据停止从直播中产生时,有什么方法可以自动停止脚本(意味着流停止并且录制也应该停止)。

注意 $rtmpUrl 和 $path 已被检查,只要脚本在直播结束前停止,一切都会正常。

任何建议都将受到高度赞赏 …

ffmpeg rtmp video-streaming video-recording

4
推荐指数
1
解决办法
6146
查看次数

使用自定义元数据嵌入视频流

我有一个提供 UDP 视频流的光学系统。

来自设备规格常见问题解答:

单一元数据 (KLV) 流和带有元数据 (KLV) 的压缩视频 (H.264) 均可在以太网链路上使用。压缩视频和元数据耦合在符合 STANAG 4609 标准的同一流中。每个编码视频流都与相关元数据封装在以太网 UDP/IP/ 上的 MPEG-TS 单节目流中。视频和元数据通过使用时间戳进行同步。

还有其他设备提供有关飞机状态的数据(速度、坐标等)。该数据应与视频一起显示在客户端 GUI 显示屏上。当然它必须与当前视频帧同步。

我想到的方法之一是将这些数据嵌入到视频流中。但我不确定是否可能或者我应该使用其他(UDP 之外)协议来实现此目的。

使用这种方法是否可能/合理?ffmpeg 库适合这种情况吗?如果没有,还有哪些其他方法可以将数据与视频帧同步。延迟至关重要。尽管带宽限制为 2-5 Mbps。


使用 ffmpeg 似乎是可能的:AVPacket可以使用av_packet_add_side_data需要预先分配的缓冲区、大小和类型的函数来提供附加数据AVPacketSideDataType。但是,我现在不确定哪个枚举值AVPacketSideDataType用于自定义用户提供的二进制数据。

类似的东西可能会满足我的需求:

如何使用 libav* 将 KLV 数据包编码为 H.264 视频

c++ ffmpeg video-streaming

4
推荐指数
1
解决办法
2376
查看次数

如何在python中从ffmpeg流中提取视频和音频

我想从 ffmpeg 流中获取单独的视频和单独的音频对象(python)

\n

为此,我在我的 rasbery pi 上运行它:

\n
ffmpeg -f alsa -thread_queue_size 1024 -channels 1 -i hw:2,0 -thread_queue_size 1024 -s 1920x1080 -i /dev/video0 -listen 1 -f matroska -vcodec libx264 -preset veryfast -tune zerolatency http://:8080\n
Run Code Online (Sandbox Code Playgroud)\n

从服务器端,我像这样连接到流。我知道如何从这个数据包对象中获取声音,但我不\xe2\x80\x99不明白如何从数据包对象中获取视频帧?我想将视频流呈现为逐个图片和单独的声音,以便在程序中进行音频和视频处理。

\n
    process = (\n        ffmpeg.input("http://192.168.1.78:8080").output(\n            '-',\n            format='matroska',\n            acodec='libvorbis',\n            vcodec='libx264'\n        ).run_async(pipe_stdout=True, pipe_stderr=True)\n    )\n    while process.poll() is None:\n        packet = process.stdout.read(4096)\n
Run Code Online (Sandbox Code Playgroud)\n

使用python 3.9 ffmpeg-python==0.2.0

\n

PS\n本质上我需要为每个包提供一个视频数组和单独的音频。

\n

python audio video ffmpeg video-streaming

4
推荐指数
1
解决办法
7743
查看次数

Agora 和 WebRTC(网络实时通信)有什么区别?

我想知道 Agora 和 Webrtc 之间的真正区别?我怎么知道 Agora 为你提供了不同平台的视频、音频通话、聊天的 SDK 并相应收费,每月免费提供 10,000 分钟,超出则收费,Webrtc 是一种 Web 实时通信,为你提供不同的服务在您的应用程序或网络中实施 API 以免费且无限制地提供视频、音频或聊天?我对吗?如果是的话,为什么人们在拥有免费的 WebRTC 并可以长时间无限地进行音频视频通话和聊天时还要使用 agora 并付费呢?请指导您的帮助将不胜感激

我对 WebRTC 不太了解,请帮助我,提前致谢

audio video-streaming webrtc agora.io

4
推荐指数
1
解决办法
2833
查看次数

如何在iphone中的特定时间戳启动嵌入式YouTube视频

我想从时间戳开始一个嵌入式YouTube视频.我知道如何在浏览器上执行此操作,但这似乎不适用于iPhone.这是MATT CUTTS的详细教程.

在特定时间戳启动嵌入式视频

在上面的链接中你可以看到我们是否在url中附加了#t = 31m08s或&start = 200但是当我在UiWebView中使用相同的url时,默认的youtube播放器从第一帧开始播放视频.任何人都可以有想法或已实现相同.我正在使用带有嵌入标签的UIWebView来播放YouTube视频.我在UIWebView中使用下面的embed标签.

 <embed id="yt" src="http://www.youtube.com/watch?v=dsFQ9kM1qDs" type="application/x-shockwave-flash" width= "500" height="400"></embed>
Run Code Online (Sandbox Code Playgroud)

下面是我用来在UIWebView中播放此视频的代码

- (IBAction) playYoutube {
    [self embedYouTube:@"http://www.youtube.com/watch?v=dsFQ9kM1qDs#t=2m08s"];
}

- (void)embedYouTube:(NSString*)url
{  
    [webView setFrame:CGRectMake(0, 0, 480, 320)];
    NSString* embedHTML = @"\
    <html><head>" 
    "<style type=\"text/css\">"
    "body {"
    "background-color: transparent;"
    "color: white;"
    "} </style>"
    "</head><body style=\"margin:0\">"
    "  <embed id=\"yt\" src=\"%@\" type=\"application/x-shockwave-flash\" "
    "width=\"%0.0f\" height=\"%0.0f\"></embed>"
    "   </body></html>";  

    NSString* html = [NSString stringWithFormat:embedHTML, url, webView.frame.size.width,  webView.frame.size.height]; 
    [webView loadHTMLString:html baseURL:nil];  
}  
Run Code Online (Sandbox Code Playgroud)

youtube iphone video video-streaming ipad

3
推荐指数
1
解决办法
6817
查看次数

有没有办法使用JavaScript在视频中"寻找"某个时间?

我有一个带视频的iframe,例如:

<iframe src="http://player.vimeo.com/video/18150336" width="500" height="281" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>
Run Code Online (Sandbox Code Playgroud)

来源并不总是vimeo,它可以是YouTube,BrightCove,Hulu等.

有没有办法使用jQuery/JavaScript在视频中的某个时间"寻找"?例如,如果我想在视频内部进入3:41,我是否可以编写代码来自动寻找那些没有API访问提供视频的网站的时间?

javascript jquery html5 video-streaming html5-video

3
推荐指数
1
解决办法
9722
查看次数

如何将iPhone捕获的视频转换为HTTP Live Streaming文件?

我在Amazon Web Services EC2/S3上有一个iOS应用程序和Django后端.目前的流程:

  1. iOS应用程序使用输出MP4的UIImagePickerController捕获视频.
  2. MP4上传到运行Django的EC2(Ubuntu)服务器.
  3. Django读取文件并上传到S3进行存储.
  4. 现在,iOS应用程序可以访问S3电影以便稍后观看.这使用渐进式流式传输(即假流式传输,只是在下载时播放).

目标: 我的目标是在此处使用HTTP直播(HLS).

有人可以提供有关如何更改当前工作流以获取S3上的HLS文件(.M3U8和.TS)以允许流式传输的建议吗?谢谢.

video-streaming http-live-streaming ios

3
推荐指数
1
解决办法
1085
查看次数

在iOS中,如何将y平面,u平面和uv平面与yuv双平面分开?

在应用程序中,我使用了AVCaptureVideo。我获得了kCVPixelFormatType_420YpCbCr8BiPlanarFullRange格式的视频。

现在我从imagebuffer获得y平面和uv平面。

  CVPlanarPixelBufferInfo_YCbCrBiPlanar *planar = CVPixelBufferGetBaseAddress(imageBuffer);

    size_t y-offset = NSSwapBigLongToHost(planar->componentInfoY.offset);
    size_t uv-offset = NSSwapBigLongToHost(planar->componentInfoCbCr.offset);
Run Code Online (Sandbox Code Playgroud)

这里yuv是双平面格式(y + UV)。

什么是紫外线平面?是uuuu,yyyy格式还是uvuvuvuv格式?如何分别获得u平面和y平面?

有人可以帮助我吗?

objective-c avfoundation video-streaming

3
推荐指数
1
解决办法
1566
查看次数

即时将多个视频文件合并为一个mpeg-ts文件

首先,对不起我的英语不好。我正在用C ++编写视频流服务器。我有多个mpeg2-ts文件(电影和广告),我需要通过HTTP将它们作为一个TS-FILE进行流式传输。问题在于每个mpeg-ts文件都有其自己的时间戳(PCR,PTS,DTS)。而且,据我所知,为了产生连续的流,每个新的PCR(PTS,DTS)值都应从上一个PCR(PTS,DTS)值开始继续。

这是一张图片,可以更好地理解我的意思:http : //i.stack.imgur.com/vL1m6.png(我不能直接在消息中包含我的图片。对不起)

我需要用新的替换pcr`1,pcr`2,pcr`3时间戳。例如,我发送了包含pcr3时间戳的ts-packet,然后再发送了几个ts数据包(不包含任何PCR值)之后,我想插入广告。我的问题是:如何计算pcr`1,pcr`2,pcr`3等的新值?

计算当前视频的比特率,然后将自上一个PCR时间戳(在本例中为pcr3)以来,程序已发送的位数除以该比特率是否正确?我的意思是:(新时间戳)=(上一个时间戳)+(位数)/(比特率)。还是有更有效的方法来做到这一点?

至于PTS和DTS时间戳,我在这里读到这些时间戳可以是非线性的。相对于我收到的最后一个原始PCR计算它是否正确?我的意思是:

pts_new = (original_pts - last_original_pcr) + pcr_new. 
dts_new = (original_dts - last_original_pcr) + pcr_new. 

(original_pts - last_original_pcr) is the difference between pts and pcr values
pcr_new is the last modified pcr value
Run Code Online (Sandbox Code Playgroud)

我的程序可以读取和编辑mpeg-ts流中的这些时间戳。幸运的是,关于如何执行此操作的文献很多。但是,如何计算这些时间戳的新值?

我刚刚开始学习mpeg2-ts的规范,如果我在某些方面有误,请更正我的错误。提前致谢。希望你理解我。

c++ video mpeg video-streaming mpeg2-ts

3
推荐指数
1
解决办法
2918
查看次数

只有单个mp4文件的MPEG-DASH视频流

我正在研究一个星期,找到一个简单且独立于平台的方法来将mp4文件流式传输到任何浏览器.在浏览器不兼容的情况下,将使用渐进流(直接下载)方法.我的情况是这样的:

  • 单个mp4文件(不分段和多路复用(音频+视频))
  • 支持HTTP字节范围服务
  • 浏览器不兼容时支持渐进式流(直接文件下载)

在研究Apple HLS,Adobe Flash Stream,Microsoft Smooth,RTSP和MPEG-DASH之后,似乎MPEG-DASH是正确的解决方案.但问题是MPEG-DASH迫使我将mp4文件拆分为单独的分段文件,这导致存储mp4文件的重复消耗空间,因为在浏览器不兼容的情况下我必须支持渐进式流.然后存储带有分段mp4文件的单个mp4文件是不可避免的.

问题是:有没有办法在任何浏览器中将单个 mp4文件作为http流渐进流提供?

MPEG-DASH协议表示它支持多路复用文件,但问题是dash.js不支持它.有没有其他javascript播放器支持带字节范围请求的多路复用和单个mp4文件?

任何其他提交我的场景条件的解决方案都受到欢迎.谢谢.

参考文献: BitCodin.com 1 BitCodin.com 2

javascript http video-streaming mpeg-dash dash.js

3
推荐指数
2
解决办法
9158
查看次数