下面给出了使用 Qt 播放视频文件的代码。我想播放来自 IP 摄像机的实时视频流,而不是播放视频。另一种方法是在 Qt 中嵌入 VLC 播放器,此处提供了该项目的链接。问题是我不知道如何在 Qt 中包含播放器。那么我该如何进行呢?
#include <QApplication>
#include <QtMultimediaWidgets/QVideoWidget>
#include <QtMultimedia/QMediaPlayer>
#include <QtMultimedia/QMediaPlaylist>
#include <QFile>
#include <QHBoxLayout>
#include "DemoPlayer.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget *widget=new QWidget;
widget->resize(400,300);
QMediaPlayer *player=new QMediaPlayer;
QVideoWidget *vw= new QVideoWidget;
QHBoxLayout *layout=new QHBoxLayout;
layout->addWidget(vw);
widget->setLayout(layout);
player->setVideoOutput(vw);
player->setMedia(QUrl::fromLocalFile("C:/Users/Administrator/Desktop/1minute.mp4"));
player->play();
widget->show();
qDebug()<<player->availableMetaData()<<player->currentMedia().canonicalUrl();
return a.exec();
}
Run Code Online (Sandbox Code Playgroud) 假设视频流通过本地网络传输:一些 VLC 客户端通过 RTSP 接收视频流。客户端能否识别用于编码视频流的格式?换句话说,我如何识别用于对通过本地网络传输的视频流进行编码的格式?我很想知道用于编码视频流的格式是 H.264 还是其他格式。
我在这里有点不知所措。
我想将实时视频广播流式传输到网络浏览器。
目前我使用 ffmpeg 将 directshow 实时源作为 webm 流传输到 node.js,然后将流转发到来自<video>元素的 http 请求。到目前为止一切正常。
live source -> ffmpeg -> POST [webm] -> node.js -> GET [webm] -> 视频标签
我的问题是源时钟和 Web 客户端时钟彼此不完全匹配(并不奇怪)。对于视频来说,这不是问题,时不时丢失或复制帧是不明显的。但是,对于音频,这是另一个问题。据我目前所知,Chrome(或任何其他浏览器)不会执行任何形式的音频重采样补偿(例如swr_set_compensation来自 ffmpeg)来补偿这种不匹配。相反,当播放缓冲区用完样本时,我会听到很明显的音频失真(一声响亮的哔哔声)。
我的问题是是否有可能在网络浏览器中实现实时源的正确播放(带音频)?
我还没有尝试使用 silverlight 或 flash 进行播放。这可能会更好吗?
我从输入流(mxf 或 mov)中获取生成的 mp4 视频流,并且在执行此操作时我将其-psnr用作 H264 参数。结果是大约。40 或 41。
然后我将输入和输出与 psnr(或 ssim)过滤器进行比较。结果大约 20 或 21。这是一个很大的区别。有没有人知道这种差异的原因?
注意:ssim 结果是相似的。第一个是 ~0.97,第二个是 ~0.83
ffmpeg -i input.mov -codec:v libx264 -psnr -f mp4 output.mp4
PSNR (~40)
ffmpeg -i output.mp4 -i input.mov -filter_complex psnr -f mp4 /dev/null
PSNR (~20)
Run Code Online (Sandbox Code Playgroud)
ffmpeg -i input.mov -codec:v libx264 -ssim -f mp4 output.mp4
SSIM (~0.98...)
ffmpeg -i output.mp4 -i input.mov -filter_complex ssim -f mp4 /dev/null
PSNR (~0.83...)
Run Code Online (Sandbox Code Playgroud) <video width="352" height="198" controls>
<source src="video.m3u8" type="application/x-mpegURL">
</video>
Run Code Online (Sandbox Code Playgroud)
此代码适用于我 android 设备上的所有浏览器,但不适用于我计算机上的 Firefox / Chrome / Safari。我需要在所有设备上播放视频。我能做什么?
我正在做项目,我需要有实时视频流。我可以使用以下命令保存视频:
proc a {} {
exec ffmpeg -f dshow -rtbufsize 64M -i "video=Integrated Webcam" -s 1280x720 -f sdl2 -
}
a
this is the current error:
Run Code Online (Sandbox Code Playgroud)
proc a {} {
exec ffmpeg -f dshow -rtbufsize 64M -i "video=Integrated Webcam" -s 1280x720 -f sdl2 -
}
a
this is the current error:
Run Code Online (Sandbox Code Playgroud)
% source c:/other/a/d.tcl
couldn't execute "ffmpeg -f dshow -t 00:00:10 -i {video=Integrated Webcam} -b 5000k -s 1280x720 c:\test\sample-a.avi": no such file or directory
% source c:/other/a/d.tcl
invalid command name …Run Code Online (Sandbox Code Playgroud) 我有一个 IP 摄像机,它通过 UDP 在 RTSP 中发送实时流,我想在浏览器中显示这个流,我希望它可以在主要浏览器和移动设备(iO 和 Android)上运行。为了实现这一点,我想在将流发送到客户端之前将流转换为服务器上的 HTTP Live Streaming (HLS)。现在我读过不久前,Apple 添加了对分段 MP4 (fMP4) 作为流格式的支持,而通常流将以 MPEG-TS 格式发送。而fMP4也是MPEG-DASH支持的格式,几年后MPEG-DASH可能会成为行业标准。
现在我的问题是,fMP4 和 MPEG-TS 的优缺点是什么?
编辑:根据 Apple 的 HLS 技术说明,直播流必须编码为 MPEG-TS 流(https://developer.apple.com/library/content/technotes/tn2224/_index.html#//apple_ref/doc /uid/DTS40009745-CH1-ENCODEYOURVARIANTS)。是否有原因或此信息已过时?
format video-streaming live-streaming http-live-streaming fmp4
我使用以下 gstreamer 命令创建了一个网络流:
发件人:
gst-launch-1.0 -v videotestsrc ! video/x-raw,framerate=20/1 ! videoscale ! videoconvert ! x264enc tune=zerolatency bitrate=500 speed-preset=superfast ! rtph264pay ! udpsink host=X.X.X.X port=5000
Run Code Online (Sandbox Code Playgroud)
接收者:
gst-launch-1.0 -v udpsrc port=5000 caps = "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96" ! rtph264depay ! decodebin ! videoconvert ! autovideosink
Run Code Online (Sandbox Code Playgroud)
这很好用。我现在想在 python 脚本中包含接收端的流。在脚本中,我想用 opencv 做一些视频处理。
有谁知道如何转换所描述的管道,以便它可以与 opencv 一起使用?
谢谢!
编辑1:
发现这应该有效:
cap = cv2.VideoCapture("udpsrc port=5000 ! application/x- rtp,media=video,payload=26,clock-rate=90000,encoding-name=H264, payload=96 ! rtph264depay ! decodebin ! videoconvert ! appsink", cv2.CAP_GSTREAMER)
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
OpenCV Error: Assertion failed (size.width>0 && size.height>0) …Run Code Online (Sandbox Code Playgroud) 我正在从事视频广播的小型家庭项目。我找到了一些示例Example,但它不起作用,因为需要旧版本的库 0.8.6。所以我找到了它,但是当我尝试从 API 获取组件时,我对非托管代码有例外。所以也许有人与 VLC 合作进行视频广播,如果您有任何示例建议,我想。
是否可以通过 FFMPEG 将带有直播(即 ip-camera)的网站流式传输到 Twitch?如果是,有人知道如何实现这一目标吗?