我正在尝试从我的Raspberry Pi中捕获H.264视频流中的单个图像.流媒体正在使用 raspivid 与Websocket一起使用.但是,无法在imshow()中显示正确的图像.我还尝试设置.reshape(),但得到ValueError: cannot reshape array of size 3607 into shape (480,640,3) 在客户端,我成功地连接到视频流并获取字节.该服务器正在使用 raspivid-broadcaster 用于视频流.我想第一个字节可以解码为图像吗?因此,我执行以下代码. async def get_image_from_h264_streaming(): uri = "ws://127.0.0.1:8080" async with websockets.connect(uri) as websocket: frame = json.loads(await websocket.recv(
以下是关于 h.264 的编程技术问答
知道思科将其H.264编解码器作为开源的事实,我想将其添加到Android WebRTC SDK中.我尝试使用WEBRTC API创建自定义VideoEncoder,但发现编解码器的选择是由其名称进行的. SoftwareVideoEncoderFactory类返回一个基于VideoCodecInfo名称代表特定编解码器的类: link .就我而言,我这样做了: VideoCodecInfo codecInfo = new VideoCodecInfo("H264", getDefaultH264Params(false)); SoftwareVideoEncoderFactory softwareVideoEncoderFactory = new SoftwareVideoEncoderFactory(); softwareVideoEncoderFactory.createEncoder(codecInfo); 然后将其添加到我的PeerConnec
我已经修改了h264_encoder_impl使用基于NVIDIA网格的硬件编码器.这是通过用NVIDIA API呼叫替换OpenH264特定调用来完成的.可以将编码的流写入文件中,但是encoded_image_的写作_buffer和_size还不够,RTPFragmentationHeader也需要填充. // RtpFragmentize(EncodedImage* encoded_image, // std::unique_ptr* encoded_image_buffer, // const VideoFrameBuffer& frame_buffer, // SFrameBSInfo* info, // RTPFragmentationHeader* frag_header)
我在Mediarecorder实施中指定了以下内容: const getMediaRecorderOptions = function () { var options = { mimeType: "video/webm;codecs=vp8" }; // 9 was lagggy, cpu-intensive if (!MediaRecorder.isTypeSupported(options.mimeType)) { logger.recorderLog(options.mimeType + " is not Supported"); options = { mimeType: "video/webm;codecs=vp8" }; if (!MediaRecorder.isTypeSupported(options.mimeType)) { logger.recorderLog(opti
尝试通过以下链条流传输视频:本地实例存储(AWS)上的H264/MP4文件 - > ffmpeg--> rtp-> rtp-> janus在同一实例 - > webrtc播放(chrome/mac)上.即使没有资源似乎超载(任何涉及的系统上的CPU/内存/网络带宽),结果视频还是断断续续的.我也使用Coturn转弯服务器,它也根本没有加载,带宽很丰富. 尝试切换编解码器,除了使用VP8外,它在工作时无济于事(有点 - 切碎仍然存在,但非常罕见和可接受),因此CPU的消耗量如此之高,实际上是不可接受的. ffmpeg -re -stream_loop -1 -i ./short.mp4 -s 426x240 -c:v libx264 -profile:v baseline -b:v 1M -r 24 -g 60 -an -f rtp rtp://127.0.0.1:5004 由此产生的SDP为: o=- 0 0 IN IP4 127.0.0.1 s=No Name
我正在为Android编写一个RTP视频流媒体,该视频流从Android Local插座读取H264编码的数据并将其化.问题是我做到了,但是我一直在客户端获得黑色框架(VoIP). 交流是这样的:android-> atterisk-> jitsi(osx)(和反向) 有一些我尚未理解的事情: 1)Android的Mediarecorder为我提供了原始的H264流,我怎么知道NAL何时基于该流进行/结束?它没有任何0x000001模式,但确实有0x0000(我假设是分隔符) 编辑: 添加更多信息.这些是2( first , second )输入缓冲区的不同读取(按顺序).如果我正确地知道,则应该使用前4个字节来获得nalu长度,而第5个字节(索引4)是nalu标题. 我将在此处复制字节值以将来用法: 1) 0 0 12 114 101 -72 4 25 -15 -1 -121 -53 ..... length = (114&0xFF)
我有一个已加载到内存中的H264视频文件,我尝试使用IMEM使用参数" Imem-cat = 4"播放它,以便VLC使用访问模块将视频脱颖而出,VLC启动和VLC成功接收我的IMEM参数: [0x7f38a0000e28] access_imem demux debug: Using get(0x404e1d), release(0x404e91), data(0x7fff5b4a9430), cookie("IMEM") 此类别也意味着我不必提供DTS和PT. VLC的IMEM模块尚未得到充分记录,但是我在多个地方发现了提示,例如 使用python in Python /p> 我的iMem-get函数只需在第一个呼叫上的视频数据设置缓冲指针,返回0,在任何其他呼叫上返回1以表示没有更多数据: int MyImemGetCallback (void *data, const char *cookie,
我正在尝试了解SDP中所需的参数是什么,以便能够从RTP数据包解码H264. 这与相关,这个问题,因为答案仅在少数情况下起作用. 示例 我正在使用以下命令从VLC流式传输. vlc -vvv sample_video/big_buck_bunny_480p_h264.mov --sout '#transcode{vcodec=h264,vb=700,fps=20,scale=0.25,acodec=none}:rtp{dst=10.5.110.117,port=5004,ttl=1}' 这将视频转码为: 比特率:700kbps 帧速率:20每秒 分辨率:原始的25% 接收器正确接受并使用以下SDP文件解释流(删除第一行,只是一个名称). //test.sdp c=IN IP4 10.5.110.117 m=video 5004 RTP/AVP 96 a=rtpmap:96 H264/90000 a=fmtp:96 profile-level-
我能够通过VLC命令行接收/查看UDP H264数据包(即VLC -network-Caching 0 -Demux H264 UDP://...) ) 我正计划通过OPENCV算法处理这些帧.但是,我似乎找不到将VLC帧发送到我的Python OpenCV脚本的方法. 是否可以在单独的脚本中通过numpy处理VLC流量输出? 我以前曾尝试过通过使用视频函数直接将其直接流到OpENCV,但是由于某种原因,视频摊位和停止以变形的黑色图像.目前,似乎合并VLC是唯一的解决方案(即使我不确定VLC为什么通过其他方法起作用). 谢谢. 编辑: 以下是终端上错误消息的摘要.似乎前几个帧似乎存在问题,但是我不知道为什么该流在VLC上起作用.从客户端,我首先发送了一个默认的密钥帧数据,然后发送了视频feed H264数据. [h264 @ 0x7f9c50020200] top block unavailable for requested intra mo
我目前正在使用在这里,但是我在测试程序时会遇到一些错误.我只想查看它是否仅使用此或所有其他.H264文件失败.因此,还有其他可以下载的来源(标准).h264示例文件进行测试吗? 谢谢. 解决方案 选项1:使用X264自己制作.这些不是标准的示例文件,但是您可以控制它们使用的H.264的哪些部分,例如不同的配置文件/级别/等,使它们仅使用i-frame-frame,使它们只有特定的大小写类型,等等.可以使它们很小,例如一个或几帧长. 选项2:也许JM软件附带了一些示例文件? http://iphome.hhi.de/suehring/suehring/tml/ 选项3:如果要测试大量文件,请以MP4格式下载一些随机拖车等,并将其降低以获取RAW .H264(例如,使用FFMPEG -VCODEC复制) 其他解决方案 这是一部经典电影: Big Buck Bunny
我看着RFC,并指出为什么会发生以下情况(尽管解码器仍然可以制作原始电影). i使用VSS H.264编码器传输了H.264/AVC NALS,字节流看起来像这样的E5 46 0E 4F FF A0 23 ... 当我在RTP广播/RTSP接收器之后阅读电影数据时,接收器端,我会获得额外的未知数据,但始终在同一位置,在开始代码前缀(0x00000001)之前添加8个字节, 在启动代码前缀之后,添加了2个字节,看起来像这样. xx xx xx xx xx xx xx xx xx xx 00 00 00 01 xx xx,然后我在Wireshark中查看,我可以看到RTP将字节添加到数据有效载荷中. > 为什么会发生为什么?为什么解码器似乎可以很好地应对这些额外的字节?! 解决方案 多数民众赞成在一些混乱的流...您可以将其弄乱的更多,并且它仍然可以起作用,因为解码器将其解析为0x000001 0x000001启动代码,跳过了在开始时添加的字节.最后的两个新
我有一个程序,可以吐出H.264原始流(即,在Android上screenrecord).我正在使用 ffmpeg 在框架上添加pts(演示时间戳记) $ my-program | ffmpeg -i - -filter:v setpts='(RTCTIME - RTCSTART) / (TB * 1000000)' out.mp4 此过滤器计算当前时间,并将其作为pts. 问题是,如果视频中没有任何更改,my-program不会产生任何输出.由于FFMPEG似乎在将它们放在setpts滤镜之前等待一堆帧,因此计算的PTS并不正确.特别是,下一个序列启动时,序列的最后帧将被时间戳. 有没有办法(使用FFMPEG或其他方式)将当前时间添加到H.264原始帧中,其中"当前时间"是接收 the Frame而不是输出它? 注意:问题是不是从管道缓冲的 . 解决方案 您可以较早分配时间戳,让Setpts简单地将其归一化为从0开始. my-program
我使用本机MediaCodec API在Android上通过RTMP进行了视频H264视频和AAC音频.视频和音频看起来很棒,但是虽然视频是在Potrait模式下拍摄的,但在网上或VLC上播放始终处于风景中. 阅读了H264规格后,我看到可以在补充增强信息(SEI)中指定这种额外的元数据,并且我已经将其添加到RAW H264 BIT流中.我的SEI NAL单元遵循这种基本格式,我计划以后进行优化: val displayOrientationSEI = { val prefix = byteArrayOf(0, 0, 0, 1) val nalHeader = byteArrayOf(6) // forbidden_zero_bit:0; nal_ref_idc:0; nal_unit_type:6 val display = byteArrayOf(47 /* Display orientation type*/, 3 /*payload siz
我正在使用opencv4android制作鹦鹉ar.drone的图像处理项目,我对整个事情都是新事物! ,,,, 是否有人想了解如何使用OpenCV从Ardrone中读取视频流,样本显示了如何仅从网络摄像头 获得视频输入 该视频以H.264格式编码,无人机在每个视频框架中添加了一个专有标题(称为PAVE),这显然这就是为什么Android无法加载视频流的原因. 谢谢 解决方案 您需要一个铺路解析器,该解析器将在H.264帧中剥离铺路标头,然后再解码并将其馈送到OpenCV. 周围有一些铺路解析器.也许您可以使用一个AS,也可以适应您的使用. 官方ar.drone sdk(在此处下载: https://projects.ardrone.org/)包括用于解码铺路的C代码;请参阅video_com_stage.c,video_stage_tcp.c,video_stage_decoder.c和video_stage_ffmpeg_decoder.c文件ARDro
基本上,计算视频大小: Video Size per Second (bps) = Frame Rate (fps) * Horizontal Pixels * Vertical Pixels * Bit Depth (bit) / Compression Ratio by Codec 当我在某个地方阅读时,MP4视频的经验法则压缩率为50.因此,对于720p 24fps 24bit 24bit Color Video(目前忽略了音频大小),将文件大小计算为: 24(fps) * 1280 * 720 * 24(bit) / 50 = 10616832 (bps) = 10.125 (Mbps) 如果您计算出上述比特率1小时的视频大小,则会得到: 10.125(Mbps) * 3600(s) / 8(bit per Byte) / 1024(MB per GB) = 4.449GB ...这似乎根本不对.从日常体验中,我们知道长1小时的720p H.264
我试图直接从相机为Android设备传输视频.到目前为止,我已经能够从Android摄像头的 OnPreviewFrame (BYTE []数据,相机)功能中捕获每个帧,然后对数据进行编码,然后成功地解码数据并显示在表面上.我将Android的 MediaCodec 用于编码和解码.但是,视频的颜色和方向不正确[ 90度旋转].搜索了一段时间后,我发现了此YV12Toyuv420packedSemiplanar函数 - 如果在将其传递给编码器之前,我在原始相机数据上使用此函数,则颜色呈正确发出,但仍然是90度旋转. public static byte[] YV12toYUV420PackedSemiPlanar(final byte[] input, final int width, final int height) { final int frameSize = width * height; final int qFrameSize = frameSize
有人知道0x21和0x61在H.264编码视频流中是什么? 我知道0x01意味着它是b-frame和0x41意味着它是p-frame.我的编码视频给了我两个0x21框架,然后是一个b-frame. I 21 21 B 21 21 B...... 这是什么0x21? 解决方案 来自H.264规格: 7.3.1 nal单元语法 forbidden_zero_bit-1位 - 应等于0. nal_ref_idc -2位 - 不等于0,指定NAL单元的内容包含序列参数集[...] nal_unit_type -5位 - 指定NAL单元中包含的RBSP数据结构的类型[...] 0x21和0x61使其成为NAL单位类型1(非IDR图片的编码切片),具有nal_ref_idc的不同值. . upd.没有人的特定位映射,特别是.从"框架"开始时,在固定位置上说是I/P/B帧.您将需要解析bitstream才能读取H.264 Spec的每7.4.3
我有一个基于WiFi的小型FPV摄像头.我设法将其获取到可以使用Python下载并保存H264文件的地步. TCP_IP = '193.168.0.1' TCP_PORT = 6200 BUFFER_SIZE = 2056 f = open('stream.h264', 'wb') sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((TCP_IP,TCP_PORT)) while True: data = sock.recv(BUFFER_SIZE) f.write(data) print("Writing") sock.close() f.close() 我已经尝试做的一段时间是播放流.我找到了流,可以下载并保存它,但是现在我想实时打开它. 我已经尝试使用VLC的"开放网络流",并使用多种选项,但它们似乎都没有用. 解决方案 我使用 成功输出到mpla