我正在尝试使用librtmp库,它可以很好地拉出流.但是现在我正在尝试发布一个流,为此我相信我必须使用RTMP_Write函数.
我在这里要完成的是一个简单的c ++程序,它将从文件读取并尝试将流推送到crtmp服务器.连接和流创建是可以的,但我对使用RTMP_Write感到很困惑.
这是我做的:
int Upload(RTMP * rtmp, FILE * file){
int nRead = 0;
unsigned int nWrite = 0;
int diff = 0;
int bufferSize = 64 * 1024;
int byteSum = 0;
int count = 0;
char * buffer;
buffer = (char *) malloc(bufferSize);
do{
nRead = fread(buffer+diff,1,bufferSize-diff,file);
if(nRead != bufferSize){
if(feof(file)){
RTMP_LogPrintf("End of file reached!\n");
break;
}else if(ferror(file)){
RTMP_LogPrintf("Error reading from file stream detected\n");
break;
}
}
count += 1;
byteSum += nRead;
RTMP_LogPrintf("Read %d from file, …Run Code Online (Sandbox Code Playgroud) 有没有人使用http://code.google.com/p/android-rtmp-client在Android上播放音频RTMP流,或者知道任何其他非Flash解决方案.android rtmp源附带的示例将音频记录到文件中,但我正在寻找通过扬声器(或蓝牙)播放的示例代码.
在Android中播放音频RTMP流的最简单方法是部分讨论所需的内容.
是否可以将RTMP协议重定向到另一个RTMP流?
如果是,我该怎么办?
详细信息:例如:我得到了 rtmp://mydomain.com/stream/redirec,我想要重定向或从中获取内容/流 rtmp://otherdomain.com/stream/
我正在尝试使用ffmpeg创建视频马赛克.我的完整命令看起来像这样 -
ffmpeg -i rtmp://localhost:1935/live/output1 -i rtmp://localhost:1935/live/output2 -i rtmp://localhost:1935/live/output3 -i rtmp://localhost:1935/live/output4 -filter_complex "nullsrc=size=640x480 [base]; [0:v] setpts=PTS-STARTPTS, scale=320x240 [upperleft]; [1:v] setpts=PTS-STARTPTS, scale=320x240 [upperright]; [2:v] setpts=PTS-STARTPTS, scale=320x240 [lowerleft]; [3:v] setpts=PTS-STARTPTS, scale=320x240 [lowerright]; [base][upperleft] overlay=shortest=0 [tmp1]; [tmp1][upperright] overlay=shortest=0:x=320 [tmp2]; [tmp2][lowerleft] overlay=shortest=0:y=240 [tmp3]; [tmp3][lowerright] overlay=shortest=0:x=320:y=240" -filter_complex amix=inputs=4:duration=longest -c:a aac -strict -2 -ar 44100 -c:v libx264 -f flv rtmp://localhost:1935/live/myStream
Run Code Online (Sandbox Code Playgroud)
只要所有4个输入流都在运行,这种方法就可以正常工作.但是说其中一个流下降了一段时间并重新上线.输出继续显示此流被卡住(暂停).因为一旦流下降(AVERROR_EOF)ffmpeg停止尝试从输入流中获取更多数据包.我必须重新启动ffmpeg进程才能恢复所有工作.
有没有办法在这里添加重试逻辑,只要进程处于活动状态,就会告诉ffmpeg继续尝试处理所有输入源?
我正在将视频帧写入文件(用于硬件加速H264编码目的)并在写入仍在进行时从那里读取数据.长话短说,我得到每帧的NALU.我的问题是如何将NALU传递给AVPacket(FFmpeg的AVPacket)数据参数,以便使用RTMP协议通过网络发送它.
我所做的是追加每个NALU(在iOS上,每帧由1或2个NALU组成)并将其设置为AVPacket数据参数,但它似乎不起作用.想法?谢谢.
我使用此方法设置数据包数据:iOS上的RTMP上的H264视频流
这个让我至少走了一个星期.我正在尝试将视频文件录制到AMS.它几乎在所有时间都很好用,除了大约十分之一或十五个录制会话,当我关闭流时,我从未在AMS的网络上收到'NetStream.Unpublish.Success'.当发生这种情况时,我使用rtmpt连接到AMS,它似乎比rtmp工作得更好.此外,似乎这只发生在Mac上的safari中,但由于它如此断断续续,我真的不相信.这是我的基本流程:
// just a way to use promises with netStatusEvents
private function netListener(code:String, netObject:*):Promise {
var deferred:Deferred = new Deferred();
var netStatusHandler:Function = function (event:NetStatusEvent):void {
if (event.info.level == 'error') {
deferred.reject(event);
} else if (event.info.code == code) {
deferred.resolve(netObject);
// we want this to be a one time listener since the connection can swap between record/playback
netObject.removeEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
}
};
netObject.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
return deferred.promise;
}
// set up for recording
private function initRecord():void {
Settings.recordFile = Settings.uniquePrefix + (new …Run Code Online (Sandbox Code Playgroud) rtmp flash-media-server actionscript-3 netstream adobe-media-server
这条线
ffmpeg -f h264 -i pipe111.fifo -c:v copy -f mp4 -
Run Code Online (Sandbox Code Playgroud)
给出错误:
Input #0, h264, from 'pipe111.fifo':
Duration: N/A, bitrate: N/A
Stream #0:0: Video: h264 (Constrained Baseline), yuv420p, 480x270, 6 fps, 6 tbr, 1200k tbn, 12 tbc
[mp4 @ 0x1562130] muxer does not support non seekable output
Output #0, mp4, to 'pipe:':
Metadata:
encoder : Lavf56.9.100
Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 480x270, q=2-31, 6 fps, 1200k tbn, 1200k tbc
Stream #0:0 -> #0:0 (copy)
Could not write …Run Code Online (Sandbox Code Playgroud) 我的目标是每秒从rtmp流中捕获一个帧,并使用OpenCV处理它.我正在使用带有Java接口的FFmpeg版本N-71899-g6ef3426和OpenCV 2.4.9(但我首先尝试使用Python).目前,我只能采用简单而肮脏的解决方案,即使用FFmpeg捕获图像,将它们存储在磁盘中,然后从我的OpenCV程序中读取这些图像.这是我正在使用的FFmpeg命令:
ffmpeg -i "rtmp://antena3fms35livefs.fplive.net:1935/antena3fms35live-live/stream-lasexta_1 live=1" -r 1 capImage%03d.jpg
Run Code Online (Sandbox Code Playgroud)
这对我来说是有用的,至少对于这个具体的rtmp来源.然后我需要以适当的方式从我的OpenCV程序中读取这些图像.我实际上没有实现这部分,因为我正在努力寻找更好的解决方案.
我认为理想的方法是直接从OpenCV捕获rtmp帧,但我找不到这样做的方法.这是我正在使用的Python代码:
cv2.namedWindow("camCapture", cv2.CV_WINDOW_AUTOSIZE)
cap = cv2.VideoCapture()
cap.open('"rtmp://antena3fms35livefs.fplive.net:1935/antena3fms35live-live/stream-lasexta_1 live=1"')
if not cap.open:
print "Not open"
while (True):
err,img = cap.read()
if img and img.shape != (0,0):
cv2.imwrite("img1", img)
cv2.imshow("camCapture", img)
if err:
print err
break
cv2.waitKey(30)
Run Code Online (Sandbox Code Playgroud)
而不是read()函数,我也尝试使用grab()和retrieve()函数而没有任何好的结果.read()函数每次都在执行,但没有收到"img"或"err".还有其他办法吗?或者也许没有办法从这样的流中直接从OpenCV 2.4.9获取帧?
我读过OpenCV使用FFmpeg来完成这类任务,但正如你所看到的,在我的情况下,FFmpeg能够从流中获取帧而OpenCV则不能.
在我无法找到直接从OpenCV获取帧的方法的情况下,我的下一个想法是以某种方式管道,FFmpeg输出到OpenCV,这似乎更难实现.
不知道,谢谢!
更新1: 我在Windows 8.1中.因为我从Eclipse PyDev运行python脚本,所以这次我从cmd运行它,我收到以下警告:
warning: Error opening file (../../modules/highgui/src/cap_ffmpeg_impl.hpp:545)
Run Code Online (Sandbox Code Playgroud)
就我所知,这个警告意味着文件路径错误,或者编解码器不受支持.现在,问题是一样的.OpenCV无法从此来源获取帧吗?
我使用ffmpeg和以下命令从相机中获取图像:
ffmpeg -y -f vfwcap -r 25 -i 0 http://10.172.180.235:8090/feed2.ffm
Run Code Online (Sandbox Code Playgroud)
在其他机器上(使用上面提到的ip)我使用以下配置文件运行ffserver:
HttpPort 8090
HttpBindAddress 0.0.0.0
MaxHTTPConnections 2000
MaxClients 1000
MaxBandwidth 3000
CustomLog -
<Stream stat.html>
Format status
ACL allow localhost
ACL allow 192.168.0.0 192.168.255.255
ACL allow 10.172.180.199
ACL allow 10.172.180.216
ACL allow 10.172.180.215
</Stream>
<Feed feed2.ffm>
File /tmp/feed2.ffm
FileMaxSize 1G
ACL allow 127.0.0.1
ACL allow 10.172.180.199
ACL allow 10.172.180.216
ACL allow 10.172.180.236
ACL allow 10.172.180.109
</Feed>
<Stream live.flv>
Format flv
Feed feed2.ffm
VideoCodec libx264
VideoFrameRate 30
VideoBitRate 800
VideoSize 1280x720 …Run Code Online (Sandbox Code Playgroud) 我想从android直播到facebook.我能够调整现有的流式传输示例到FB.
第一步或多或少有效(音频仍然是一个问题,但不在她的范围内).我可以流到FB.
我现在想用透明的png图像覆盖流.
我在启动时创建了一个FFmpegFrameFilter:
try{
filter = new FFmpegFrameFilter("movie="+path+"/image.png [logo];[in][logo]overlay=0:0:format=rgb [out]",imageWidth, imageHeight);
filter.start();
}catch (FrameFilter.Exception e){
Log.e(CLASS_LABEL,"Error while starting filter: "+e.getMessage());
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
并在每个框架上执行以下操作:
filter.push(yuvImage);
Frame frame;
while ((frame = filter.pull()) != null) {
recorder.record(frame,avutil.AV_PIX_FMT_NV21);
}
Run Code Online (Sandbox Code Playgroud)
问题是我不知道我应该使用哪种像素格式.我的叠加图片有rgb颜色(https://postimg.org/image/f1ri3vj43/)
使用上面的像素格式我得到这样的东西:https://postimg.org/image/45ha64q9z/
我很沮丧,因为我已经尝试了很多像素格式.所有输出都不同,有时徽标会多次出现.
有没有办法找出我应该从avutil.java的可能性中选择哪一个?
编辑:您可以在https://github.com/y4nnick/android_streaming/blob/master/app/src/main/java/com/example/yannick/olay1/RecordActivity.java上找到整个代码.
编辑:我已经尝试过以下格式:
// AV_PIX_FMT_ARGB --> 4 at once, all black/white
// AV_PIX_FMT_0RGB --> 4 at once, all black/white
// AV_PIX_FMT_BGR8 --> 1 a bit to big, strange colors
// AV_PIX_FMT_BGR4_BYTE --> 1 a …Run Code Online (Sandbox Code Playgroud)