我正在尝试使用gstreamer的GStreamer编辑服务来连接2个视频,并在两者之间进行转换.
这个命令只是将两段视频连接在一起而没有过渡,工作正常:
ges-launch-0.10 vshort01.mov 0 5 vshort02.mov 5 5 -r -o file:///tmp/foo.mov
Run Code Online (Sandbox Code Playgroud)
这是它的输出:
$ ges-launch-0.10 vshort01.mov 0 5 vshort02.mov 5 5 -r -o file:///tmp/foo.mov
save_path: (null)
load_path: (null)
Adding file:///home/rory/vshort01.mov inpoint:0:00:00.000000000 duration:0:00:05.000000000
Adding file:///home/rory/vshort02.mov inpoint:0:00:05.000000000 duration:0:00:05.000000000
Done
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用此命令在两个视频之间进行短暂转换,它就会挂起.
ges-launch-0.10 vshort01.mov 0 5 +transition crossfade 2 vshort02.mov 5 5 -r -o file:///tmp/foo.mov
Run Code Online (Sandbox Code Playgroud)
输出,我得到的是:
save_path: (null)
load_path: (null)
Adding file:///home/rory/vshort01.mov inpoint:0:00:00.000000000 duration:0:00:05.000000000
Adding <transition:crossfade> duration 0:00:02.000000000
Adding file:///home/rory/vshort02.mov inpoint:0:00:05.000000000 duration:0:00:05.000000000
Run Code Online (Sandbox Code Playgroud)
它挂起了.该文件/tmp/foo.mov保持0字节,并且没有CPU活动.
我是
ges0.10-toolsubuntu 11.04 natty上的软件包版本0.10.1-1.我今天从git clone尝试了一个新构建的gst-editing-services版本c2668d058501513b734c8a8013a5e78c817712bb …
我很舒服C.但需要学习GObject和Glib进行gstreamer.我在网上找到的只是Gobject参考手册.它很好,但寻找Gobject/Glib的教程,主要关注gstreamer.
所以请分享任何其他资源来学习滑稽和gobject.
我正在尝试使用Raspberry pi 2 B中的QtMediaPlayer播放视频.源代码如下:
QMediaPlayer *media;
QVideoWidget *video;
...
...
media = new QMediaPlayer(parent);
video = new QVideoWidget(parent);
media->setVideoOutput(video);
media->setMedia(QUrl::fromLocalFile("/home/pi/Desktop/test3.mp4"));
media->play();
Run Code Online (Sandbox Code Playgroud)
但结果是一个空白的视频屏幕,并出现以下错误:
** (Bus:2148): WARNING **: ffmpegcolorspace-vo: size 1105920 is not a
multiple of unit size 829440
Error: "GStreamer encountered a general stream error."
Run Code Online (Sandbox Code Playgroud)
系统信息
运行最新的raspbian Jessie OS,已安装的Qt5.3,已安装的gstreamer0.10-plugins-good/bad/ugly/ffmpeg和已安装的Mpeg-2许可证
这是视频test3.mp4
我在安装了Qt5的Windows中运行此代码; 它在那里工作.但它不适用于Raspberry pi.请告诉我这里我缺少什么.
从壳牌尝试管道
我一直在尝试使用新的低级MediaCodec,在Android平板电脑上使用H264编码来处理摄像头捕获的输入.我已经遇到了一些困难,因为MediaCodecAPI的文档很少,但我终于有了一些工作要做.
我按如下方式设置相机:
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewFormat(ImageFormat.YV12); // <1>
parameters.setPreviewFpsRange(4000,60000);
parameters.setPreviewSize(640, 480);
mCamera.setParameters(parameters);
Run Code Online (Sandbox Code Playgroud)
对于编码部分,我正在实例化MediaCodec对象,如下所示:
mediaCodec = MediaCodec.createEncoderByType("video/avc");
MediaFormat mediaFormat = MediaFormat.createVideoFormat("video/avc", 640, 480);
mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 500000);
mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 15);
mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT,
MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar); // <2>
mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 5);
mediaCodec.configure(mediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
mediaCodec.start();
Run Code Online (Sandbox Code Playgroud)
最终目标是创建一个RTP流(并与Skype对应),但到目前为止,我只是将原始H264直接流式传输到我的桌面.在那里,我使用以下GStreamer管道来显示结果:
gst-launch udpsrc port=5555 ! video/x-h264,width=640,height=480,framerate=15/1 ! ffdec_h264 ! autovideosink
Run Code Online (Sandbox Code Playgroud)
一切都很好,除了颜色.我需要在计算机中设置2个颜色格式:一个用于摄像头预览(行标记<1>)和一个用于MediaCodec对象(标记为<2>)
确定<1>我使用的线的可接受值parameters.getSupportedPreviewFormats().据此,我知道相机上唯一支持的格式是ImageFormat.NV21和ImageFormat.YV2.
为<2>,我检索的MediaCodecInfo.CodecCapabilities -object类型视频/ AVC,作为整数值与对应19(MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar和2130708361(其不与任何值对应MediaCodecInfo.CodecCapabilities).
除上述之外的任何其他值都会导致崩溃.
结合这些设置会得到不同的结果,我将在下面展示.这是Android上的屏幕截图(即"真实"颜色):
以下是Gstreamer显示的结果:
<1> …
我在弄清楚如何使用gstreamer创建一个简单的rtp流并在vlc上显示它时遇到了一些麻烦.
我安装了GStreamer 0.10.30和VLC 1.1.3.我唯一的要求是使用MPEG4或H.264编解码器.
现在,我可以通过这个简单的管道流式传输GStreamer videotestsrc:
gst-launch videotestsrc ! ffenc_mpeg4 ! rtpmp4vpay ! udpsink host=127.0.0.1 port=5000
Run Code Online (Sandbox Code Playgroud)
它输出客户端接收流所需的"上限":
/GstPipeline:pipeline0/GstUDPSink:udpsink0.GstPad:sink: caps = application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)MP4V-ES, profile-level-id=(string)1, config=(string)000001b001000001b58913000001000000012000c48d8800f50a041e1463000001b24c61766335322e3132332e30, payload=(int)96, ssrc=(uint)365697461, clock-base=(uint)390754204, seqnum-base=(uint)10399
Run Code Online (Sandbox Code Playgroud)
我还可以使用以下管道显示流:
gst-launch udpsrc uri=udp://127.0.0.1:5000 caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)MP4V-ES, profile-level-id=(string)1, config=(string)000001b001000001b58913000001000000012000c48d88007d0a041e1463000001b24c61766335322e3132332e30, payload=(int)96, ssrc=(uint)298758266, clock-base=(uint)3097828288, seqnum-base=(uint)63478" ! rtpmp4vdepay ! ffdec_mpeg4 ! autovideosink
Run Code Online (Sandbox Code Playgroud)
但是当我尝试用vlc接收流时:
vlc -vvv rtp://127.0.0.1:5000
Run Code Online (Sandbox Code Playgroud)
我一无所获......
我正在使用Gnonlin播放2个视频.有一刻,我想暂停一个视频并运行另一个视频.但是,我不想手动暂停管道,因为另一个视频也将被暂停.
例如:
self.video[0].set_property("location", LOCATION_VIDEO1)
self.video[0].set_property("start", 0 * gst.SECOND)
self.video[0].set_property("duration", 5 * gst.SECOND)
self.video[0].set_property("media-start", 0 * gst.SECOND)
self.video[0].set_property("media-duration", 5 * gst.SECOND)
Run Code Online (Sandbox Code Playgroud)
此视频运行5秒钟.我该怎么做才能在接下来的5秒内暂停或停止播放此视频?有没有办法显示相同的帧5秒?
我的目标是从 rtsp 服务器读取帧,对帧进行一些 opencv 操作并将操作的帧写入新的 rtsp 服务器。
我尝试了以下基于在 python 中从 opencv 写入 Gstreamer 管道的方法,但我无法弄清楚创建 rtsp 服务器的适当 gst-launch-1.0 参数应该是什么。任何人都可以协助 gst-launch-1.0 的适当参数吗?我试过的那些卡在“管道正在预滚动”中
import cv2
cap = cv2.VideoCapture("rtsp://....")
framerate = 25.0
out = cv2.VideoWriter('appsrc ! videoconvert ! '
'x264enc noise-reduction=10000 speed-preset=ultrafast
tune=zerolatency ! '
'rtph264pay config-interval=1 pt=96 !'
'tcpserversink host=192.168.1.27 port=5000 sync=false',
0, framerate, (640, 480))
counter = 0
while cap.isOpened():
ret, frame = cap.read()
if ret:
out.write(frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
cap.release()
out.release()
Run Code Online (Sandbox Code Playgroud)
我还尝试了另一种基于Write …
有关:
我的问题是如何从视频文件中提取wav音轨video.avi呢?我阅读了许多文章,并且人们建议使用(从Python)ffmpeg作为子进程(因为没有可靠的python绑定到ffmpeg - 唯一的希望是,PyFFmpeg但我发现它现在没有维护).我不知道这是不是正确的解决方案,我正在寻找一个好的解决方案.
我看了gstreamer并发现它很好但无法满足我的需求 - 我发现从命令行完成此任务的唯一方法就像
gst-launch-0.10 playbin2 uri=file://`pwd`/ex.mp4 audio-sink='identity single-segment=true ! audioconvert ! audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)16000, channels=(int)1 ! wavenc ! filesink location=foo.wav’
Run Code Online (Sandbox Code Playgroud)
但它效率不高,因为我需要在播放视频和同时写入wav文件时等待多年.
ffmpeg 好多了:
avconv -i foo.mp4 -ab 160k -ac 1 -ar 16000 -vn ffaudio.wav
Run Code Online (Sandbox Code Playgroud)
但是我无法从python启动它(不是作为命令行子进程).你能否指出我从python作为命令行实用程序启动ffmpeg的优点和缺点?(我的意思是使用python multiprocessing模块或类似的东西).
第二个问题.
将长wav文件剪成碎片的简单方法是什么,这样我就不会破坏任何单词?我的意思是10到20秒的长度,句子/单词在暂停期间的开始和结束?
我知道如何在任意作品上打破它们:
import wave
win= wave.open('ffaudio.wav', 'rb')
wout= wave.open('ffsegment.wav', 'wb')
t0, t1= 2418, 2421 # cut audio between 2413, 2422 seconds
s0, s1= int(t0*win.getframerate()), int(t1*win.getframerate())
win.readframes(s0) …Run Code Online (Sandbox Code Playgroud) 我在Qt视频概述中给出了一个月的视频示例.
我试过那段代码,但只有我得到的是空白方块(QWidget).我使用GStreamer0.10进行Qt5上的媒体播放.我也用gst-launch-0.10命令播放了视频,它运行正常,但我无法确定Qt中发生了什么以及为什么它不起作用?
我查看了位于的X Server的错误日志/etc/X11/Xorg.0.log,当我使用fbdev作为其中配置的显示驱动程序/etc/X11/xorg.conf时显示错误:
"FBDEV(0):FBIOPUTCMAP:参数无效"
当我使用modesetting驱动程序时,一切都行为相同,但没有错误.我发现,当我删除xorg.conf文件并再次启动X服务器时,视频可以正常工作,但缺少颜色和闪烁也可以在我的Ubuntu VM和vnc客户端上运行良好.我们将非常感谢您的建议和帮助.
目标机器:BeagleBone Black
发行:Debian Jessie 8.2
内核版本:4.1.15-ti-rt-r43
/ usr/lib/xorg/modules/drivers中可用驱动程序列表:ati_drv.so,mach64_drv.so,nouveau_drv.so,r128_drv.so,vesa_drv.so,fbdev_drv.so,modesetting_drv.so,omap_drv.so,radeon_drv.所以
当我尝试在Debian Jessie 8.2下的BeagleBone Black上启动我的Qt应用程序时,这是来自Xorg的完整错误日志 - > http://pastebin.com/4x8KztBk
来自/ etc/X11的xorg.conf文件 - > http://pastebin.com/4WhX8pJc
我有一个通过HTTPS进行RTSP的流.
握手是安全的(通过https),但握手完成后的数据未加密(在RTSP中).
默认情况下,GStreamer不会流式传输,因为它也希望数据加密(在RTSPS中),这不是我的情况.
我尝试了很多东西但似乎没什么用.例如,在我开始获取流后,我尝试将其写入本地端口并将该URL传递给GStreamer,但它不会播放.
我是这个GStreamer的新手,所以我对玩家的了解有限.我正在寻找一种方法来通过GStreamer完成握手,这是HTTPS(安全),然后我得到的流没有加密.如果有人做过类似的事情,请告诉我任何流式RTSP的方法.我尝试过类似的东西
nativeSetPipeline("rtspsrc location=rtsph://<URL of the video stream> latency=100 ! rtph264depay ! avdec_h264 ! glimagesink");
Run Code Online (Sandbox Code Playgroud)
上面的管道默认工作,GStreamer通过HTTP播放RTSP,但是当我通过HTTPS尝试RTSP时
nativeSetPipeline("rtspsrc debug = TRUE do-rtcp=false location=\"rtspsh://<secured URL of the stream>" latency=100 do-rtsp-keep-alive=true ! rtph264depay ! avdec_h264 ! glimagesink");
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为GStreamer也希望流也得到保护.有关如何通过HTTPS流式传输RTSP的任何想法/代码段或示例?我使用的当前版本是1.10.4.