我正在使用基于WinPCap构建的SharpPCap来捕获UDP流量.我的最终目标是从H.323捕获音频数据并将这些电话对话保存为WAV文件.但首先要做的是 - 我需要弄清楚我的UDP数据包是通过网卡的.
SharpPCap提供了一个UdpPacket类,使我可以访问消息的PayloadData.但我不确定这些数据是做什么的.它是一个Byte []数组,我不知道如何确定它是否是RTP或RTCP数据包.
我用Google搜索了这个主题,但那里没有多少.任何帮助表示赞赏.
我有FFMPEG流媒体基线h264视频,我必须将其封装在RTP中并发送到SIP电话进行解码.我正在使用Linphone和Windows和Mirial的h264插件进行解码.但是,有时我会从FFMPEG获得一个巨大的帧大小(3Kb~9Kb),这显然不适合MTU.
如果我"按原样"发送这些帧并信任IP分段功能,一些手机能够很好地播放它,但是其他手机扼流并且无法解码流.我认为这是因为流不符合RFC 3984,该RFC 3984规定不适合MTU的数据包必须分成不同的NALU,并使用RTP的Mark功能标记Frame的结尾.
我怎么知道在哪里可以"切割"I或P帧?我注意到碎片化的h264数据包(没有Mark标签的数据包)有时会在0xF8中完成,但无法完全获得模式,并且在描述如何通过RTP发送这些数据包的RFC 3984中没有指定如何执行此操作.
更新:有谁知道如何告诉X264库如何生成最大大小的NALU?这样我应该能够避免这个问题.感谢大家
开发一个简单的应用程序以在Android 4.1上播放RTSP流,但无法这样做
更新
如果我使用BigBuckBunny_115k.mov,我能够玩
Uri video = Uri.parse("rtsp://184.72.239.149/vod/mp4:BigBuckBunny_115k.mov");
Run Code Online (Sandbox Code Playgroud)
****问题:我在手机上看不到任何信息流,只能看到黑屏.过了一段时间,会出现一个对话框"无法播放此视频".我尝试了很多RTSP流,但结果相同,所以提到的所有流都有问题吗?或.sdp没有正确解析?代码段中缺少哪些内容?****
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
VideoView videoView = (VideoView) findViewById(R.id.video);
MediaController mediaController = new MediaController(this);
mediaController.setAnchorView(videoView);
mediaController.setMediaPlayer(videoView);
Uri video = Uri.parse("rtsp://ss1c6.idc.mundu.tv:554/prf0/cid_29.sdp");
videoView.setMediaController(mediaController);
videoView.setVideoURI(video);
videoView.start();
}
Run Code Online (Sandbox Code Playgroud)
<VideoView
android:id="@+id/video"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true" />
Run Code Online (Sandbox Code Playgroud)
<uses-sdk
android:minSdkVersion="11"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.rdx.livetv.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" …
Run Code Online (Sandbox Code Playgroud) 我想在流视频应用程序中动态切换视频源.但是,不同的视频源具有独特的图像尺寸.我可以为每个视频源生成单独的SDP文件,但我想将它们组合成一个SDP文件,以便查看客户端可以在视频源更改时自动调整显示窗口的大小.以下是两个示例SDP文件:
640x480.sdp:
v=0 o=VideoServer 305419896 9876543210 IN IP4 192.168.0.2 s=VideoStream640x480 t=0 0 c=IN IP4 192.168.0.2 m=video 8000/2 RTP/AVP 96 a=rtpmap:96 H264/90000 a=fmtp:96 packetization-mode=0; profile-level-id=4D4033; sprop-parameter-sets=Z01AM5ZkBQHtCAAAAwAIAAADAYR4wZU=,aO48gJ== a=control:trackID=1
960x480.sdp:
v=0 o=VideoServer 305419896 9876543210 IN IP4 192.168.0.2 s=VideoStream960x480 t=0 0 c=IN IP4 192.168.0.2 m=video 8000/2 RTP/AVP 96 a=rtpmap:96 H264/90000 a=fmtp:96 packetization-mode=0; profile-level-id=4D4033; sprop-parameter-sets=J01AM5WwPA9sBAIA,KO4G8gA= a=control:trackID=1
如何将这些单个文件合并为一个SDP文件?
我使用VLC作为rtsp服务器在Android MediaPlayer上实现了RTSP,代码如下:
# vlc -vvv /home/marco/Videos/pippo.mp4 --sout
#rtp{dst=192.168.100.246,port=6024-6025,sdp=rtsp://192.168.100.243:8080/test.sdp}
Run Code Online (Sandbox Code Playgroud)
并在Android项目上:
Uri videoUri = Uri.parse("rtsp://192.168.100.242:8080/test.sdp");
videoView.setVideoURI(videoUri);
videoView.start();
Run Code Online (Sandbox Code Playgroud)
这工作正常,但如果我也想播放实时流RTP,所以我将sdp文件复制到sdcard(/mnt/sdcard/test.sdp)并设置vlc:
# vlc -vvv /home/marco/Videos/pippo.mp4 --sout
#rtp{dst=192.168.100.249,port=6024-6025}
Run Code Online (Sandbox Code Playgroud)
我尝试播放流RTP设置本地sdp文件的路径:
Uri videoUri = Uri.parse("/mnt/sdcard/test.sdp");
videoView.setVideoURI(videoUri);
videoView.start();
Run Code Online (Sandbox Code Playgroud)
但是我收到了一个错误:
D/MediaPlayer( 9616): Couldn't open file on client side, trying server side
W/MediaPlayer( 9616): info/warning (1, 26)
I/MediaPlayer( 9616): Info (1,26)
E/PlayerDriver( 76): Command PLAYER_INIT completed with an error or info PVMFFailure
E/MediaPlayer( 9616): error (1, -1)
E/MediaPlayer( 9616): Error (1,-1)
D/VideoView( 9616): Error: 1,-1
Run Code Online (Sandbox Code Playgroud)
有谁知道问题出在哪里?我错了或者无法在MediaPlayer上播放RTP?干杯乔治
是否可以在iPhone上通过RTP/RTSP查看视频流(H.264实时馈送)?如果没有,是否可以为此目的编写申请?
我找不到上一个问题的解决方案,所以我决定一步一步地尝试.
我现在要做的是将RTP/H264流存储为文件.
到目前为止我发现的是以下内容:
(首先我的RTP/H264是FU-A的形式)
| RTP HEADER 12bytes long | FU INDICATOR 1byte | FU HEADER 1byte | FU payload |
Run Code Online (Sandbox Code Playgroud)
据我了解RFC 6184文档,我正在使用一个数据包启动一个NAL,该数据包在FU Header的第一位有'1',并追加在第一位设置'0'的数据包,直到最后一个数据包为'1'在FU Header的第二位.
我认为这是如何在FU-A分组化之前获得完整的NAL以及我发现的是我需要将'起始位'(0x00000001)放在每个完整NAL的前面.
但到目前为止没有运气.以下是日志的一部分
========= the new NAL is as 1400
[0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]7C/1111100 [5]85/10000101 [6]B8/10111000 [7]40/1000000 ...
========= adding the next NAL as 1400
[0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]7C/1111100 [5]85/10000101 [6]B8/10111000 [7]40/1000000 ...
========= adding the next NAL as 1400
[0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]7C/1111100 [5]85/10000101 [6]B8/10111000 [7]40/1000000 ...
========= adding the …
Run Code Online (Sandbox Code Playgroud) 过去一周我一直在尝试通过RTP实现H.264流,使用x264作为编码器,使用libavformat来打包和发送流.问题是,据我所知,它无法正常工作.
现在我只是编码随机数据(x264_picture_alloc)并从libx264中提取NAL帧.这很简单:
x264_picture_t pic_out;
x264_nal_t* nals;
int num_nals;
int frame_size = x264_encoder_encode(this->encoder, &nals, &num_nals, this->pic_in, &pic_out);
if (frame_size <= 0)
{
return frame_size;
}
// push NALs into the queue
for (int i = 0; i < num_nals; i++)
{
// create a NAL storage unit
NAL nal;
nal.size = nals[i].i_payload;
nal.payload = new uint8_t[nal.size];
memcpy(nal.payload, nals[i].p_payload, nal.size);
// push the storage into the NAL queue
{
// lock and push the NAL to the queue
boost::mutex::scoped_lock lock(this->nal_lock);
this->nal_queue.push(nal);
} …
Run Code Online (Sandbox Code Playgroud) 我对RTP很新,有人可以解释一下CSRC和SSRC吗?
来自http://www.rfc-editor.org/rfc/rfc3550.txt,它的含义是:SSRC字段标识同步源.这是否意味着,在网络中可能有许多发送者正在为RTP(多播网络)做出贡献并确定数据包来自哪个来源?
CSRC:贡献源(CSRC):RTP数据包流的来源,它对RTP混频器产生的组合流做出了贡献(见下文).不清楚,不知道,不懂.
有人可以用例子解释一下吗?谢谢
如果您正在尝试开发交互式直播应用程序,则需要依赖超低(实时)延迟.例如,用于视频会议或远程实验室.
适合这种情况的两种协议是:
*WebRTC:由于我试图为更大的受众提供互相交流的可能性,因此WebRTC并不合适.因为据我所知,它不是为更多的观众设计的.
我的问题:
我应该为这个用例选择哪一个?RTSP/RTP还是RTMP?
哪种协议可以提供有关端到端延迟,会话启动时间的更好结果?
哪一个消耗更多的硬件资源?
RTMP似乎使用持久TCP连接.但是哪种协议用于传输?它不能是TCP,因为这无法确保实时延迟?
一般来说,使用这两种协议的利弊是什么?
我没有在科学论文或书籍中找到这两个协议的任何比较.只有着名的移动直播应用Periscope正在使用RTMP.
Instagram或Facebook等其他应用程序例如提供与流媒体的基于文本的交互.如果开发人员想要构建基于交互式直播流的下一个"杀手级应用程序":我认为这个问题是必不可少的.