我使用套接字作为MediaPlayer的代理,因此可以在将mp3音频写入套接字之前下载并解密。 这类似于NPR新闻应用程序中显示的示例,但是我将其用于所有Android版本2.1-4 atm。
NPR StreamProxy代码-[http://code.google.com/p/npr-android-app/source/browse/Npr/src/org/npr/android/news/StreamProxy.java]
我的问题是,对于2.1-2.3而言,播放速度很快,但是在Android 4.0 ICS中,MediaPlayer在触发onPrepared侦听器之前会缓冲太多数据。
在onPrepared()之前写入Socket OutputStream的数据量示例:
在具有2.3.4的SGS2上-约133920字节后的onPrepared()
在使用4.0.4的Nexus S上-约961930字节后的onPrepared()
这也发生在Galaxy Nexus上。
奇怪的是4.0仿真器不像4.0设备那样缓冲太多的数据。 任何人在ICS上遇到MediaPlayer的类似问题?
编辑
这是代理写入套接字的方式。 在此示例中,它是从文件加载的CipherInputStream中获得的,但是从HttpResponse中加载它的情况相同。
final Socket client = (setup above)
// encrypted file input stream
final CipherInputStream inputStream = getInputStream(file);
// setup the socket output stream
final OutputStream output = client.getOutputStream();
// Writing the header
final String httpHeader = buildHttpHeader(file.length());
final byte[] buffer = httpHeader.getBytes("UTF-8");
output.write(buffer, 0, buffer.length);
int writtenBytes = 0;
int readBytes;
final byte[] buff = new byte[1024 * 12]; // 12 KB
while (mIsRunning && (readBytes = inputStream.read(buff)) != -1) {
output.write(buff, 0, readBytes);
writtenBytes += readBytes;
}
output.flush();
output.close();
在音频之前写入MediaPlayer的HTTP标头。
private String buildHttpHeader(final int contentLength) {
final StringBuilder sb = new StringBuilder();
sb.append("HTTP/1.1 200 OK\r\n");
sb.append("Content-Length: ").append(contentLength).append("\r\n");
sb.append("Accept-Ranges: bytes\r\n" );
sb.append("Content-Type: audio/mpeg\r\n");
sb.append("Connection: close\r\n" );
sb.append("\r\n");
return sb.toString();
}
我四处寻找替代实现,但是由于我已经加密了音频并且MediaPlayer不支持InputStreams作为数据源,所以我唯一的选择(我认为..)是使用诸如此类的代理。
同样,这在Android 2.1-2.3上运行良好,但在ICS中,MediaPlayer在播放之前会缓冲大量此类数据。
编辑2:
进一步的测试表明,一旦升级到Android 4.0.3,这在SGS2上也是一个问题。 因此,似乎MediaPlayer的缓冲实现在4.0中已发生了显着变化。 由于API无法提供任何更改行为的方式,因此令人沮丧。
编辑3:
已创建Android错误。 请添加评论并在其中加注星标[http://code.google.com/p/android/issues/detail?id=29870]
编辑4:
我的播放代码相当标准。.我在onPrepared()方法中对MediaPlayer进行了start()调用。
mCurrentPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mCurrentPlayer.setDataSource(url);
mCurrentPlayer.prepareAsync();
仅使用prepare()和ajacian81的推荐方法进行了尝试,但无济于事。
我应该补充一点,最近有一位Google员工回覆了我的问题,并确认ICS(用于HD内容)的缓冲区大小是有意增加的。 已要求API开发人员添加在MediaPlayer上设置缓冲区大小的功能。
尽管我认为这个API更改请求在我来之前就已经存在了,所以我不建议任何人屏住呼吸。
我正在开发一个使用大型MySQL表的spring应用程序。 加载大表时,我得到connection.close()
,因为驱动程序试图将整个表加载到应用程序内存中。
我尝试使用
statement.setFetchSize(Integer.MIN_VALUE);
但随后我打开的每个ResultSet都挂在connection.close()
上; 在网上查看时,我发现发生这种情况是因为它尝试在关闭ResultSet之前尝试加载所有未读的行,但事实并非如此,因为我这样做是:
ResultSet existingRecords = getTableData(tablename);
try {
while (existingRecords.next()) {
// ...
}
} finally {
existingRecords.close(); // this line is hanging, and there was no exception in the try clause
}
小表(3行)也会发生挂起,如果我不关闭RecordSet(用一种方法发生),则connection.close()
会挂起。
挂起的堆栈跟踪:
SocketInputStream.socketRead0(FileDescriptor,byte [],int,int,int)行:不可用[本机方法]
SocketInputStream.read(byte [],int,int)行:129
ReadAheadInputStream.fill(int)行:113
ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(byte [],int,int)行:160
ReadAheadInputStream.read(byte [],int,int)行:188
MysqlIO.readFully(InputStream,byte [],int,int)行:2428 MysqlIO.reuseAndReadPacket(Buffer,int)行:2882
MysqlIO.reuseAndReadPacket(Buffer)行:2871
MysqlIO.checkErrorPacket(int)行:3414
MysqlIO.checkErrorPacket()行:910
MysqlIO.nextRow(Field [],int,boolean,int,boolean,boolean,boolean,Buffer)行:1405
RowDataDynamic.nextRecord()行:413
RowDataDynamic.next()行:392 RowDataDynamic.close()行:170
JDBC4ResultSet(ResultSetImpl).realClose(boolean)行:7473 JDBC4ResultSet(ResultSetImpl).close()行:881 DelegatingResultSet.close()行:152
DelegatingResultSet.close()行:152
DelegatingPreparedStatement(DelegatingStatement).close()行:163
(这是我的课程)Database.close()行:84
AVPlayer的文档规定以下内容:
[The]播放器可以很好地处理本地和远程媒体文件
但是,AVAudioPlayer的文档指出以下内容:
Apple建议您使用此类进行音频播放,除非您要播放从网络流捕获的音频
对于我正在做的工作,我需要一些AVAudioPlayer的功能,但是我的所有音频都正在流式传输。 我需要AVAudioPlayer中AVPlayer没有的主要内容是“播放”属性。 如果没有该属性,则很难构建播放器用户界面。
那么,AVPlayer和AVAudioPlayer有什么区别,使后者不适合网络流传输? 有没有办法从AVAudioPlayer提供的AVPlayer中获取一些信息,例如“播放”属性?
我正在研究与RackSpace云文件(类似于Amazon S3,但缺少某些功能)进行通信的Ruby on Rails应用程序。
由于缺乏按对象访问权限和查询字符串身份验证的可用性,必须通过应用程序来介导对用户的下载。
在Rails 2.3中,看起来可以像下面那样动态构建响应:
# Streams about 180 MB of generated data to the browser.
render :text => proc { |response, output|
10_000_000.times do |i|
output.write("This is line #{i}\n")
end
}
(摘自[http://api.rubyonrails.org/classes/ActionController/Base.html#M000464)]
代替call
,我可以在其中转储我的cloudfiles流生成代码。
麻烦的是,这是我在Rails 3中尝试使用此技术时得到的输出。
#<Proc:0x000000010989a6e8@/Users/jderiksen/lt/lt-uber/site/app/controllers/prospect_uploads_controller.rb:75>
好像未调用proc对象的call
方法? 还有其他想法吗?
private void StartReceivingData(string ipAddress, int iPort)
{
try
{
if (!_bContinueReciving)
{
//initializeMainSocket(ipAddress, iPort);
_mSocket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);//<------HERE IS RAISED THE EXCEPTION
_mSocket.Bind(new IPEndPoint(IPAddress.Parse(ipAddress), iPort));
// _mSocket.Bind(new IPEndPoint(IPAddress.Loopback, iPort));
_mSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, true);
_mSocket.IOControl(IOControlCode.ReceiveAll, new byte[4] { 1, 0, 0, 0 }, new byte[4] { 0, 0, 0, 0 });
//var 1
_mSocket.BeginReceive(_buffReceivedData, 0, _buffReceivedData.Length, SocketFlags.None,
new AsyncCallback(OnReceive), null);
initializeLocalSocket();
}
else
{
_bContinueReciving = false;
_mSocket.Close();
}
}
catch (Exception exception)
{
Debug.WriteLine(exception);
}
}
我不明白为什么...它起作用了,现在却没有了。 有人可以帮我吗?我正在通过vlc进行流式传输,并且我不想接收数据包,进行一些报告,然后将其本地流式传输到播放器
我发现Android MediaPlayer准备使用不同流进行实时流播放所需的时间存在很大差异。
硬数据
我在prepareAsync()和onPrepared(MediaPlayer mp)回调之间添加了日志记录,并分别测试了几个流。 每个流的时间非常一致(+/-一秒),结果如下:
测试是在3G连接(约1100 Kbps)和Android 2.3.4的Nexus S上进行的。
播放非流式MP3音频文件不是问题。
以下是我如何播放视频流的摘要:
准备MediaPlayer:
...
mediaPlayer.setDataSource(playUrl);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.prepareAsync();
...
然后在onPrepared(MediaPlayer mp)中:
mediaPlayer.start();
为什么准备一些流而不用准备其他流需要这么长时间? 以上数据似乎表明它可能是基于已缓冲的数据量而不是缓冲的音频内容的持续时间。 真的可以吗?
更新:我已经在具有Android 1.6、2.2和2.3.4的物理设备以及具有1.6、2.1、2.2、2.3.1和2.3.3的模拟器上测试了实时流。 我只看到2.3.3和2.3.4的长时间延迟。 旧版本将在5秒钟内开始播放。
我正在为我的应用程序使用烧瓶。 我想将图像(由PIL动态生成)发送到客户端,而不保存在磁盘上。
任何想法如何做到这一点?
我一直在使用Node.js中的二进制流进行实验,令我惊讶的是,实际上有一个工作演示,它使用节点无线电流获取Shoutcast流,并使用分块编码将其推送到HTML5元素中。 但这仅适用于Safari!
这是我的服务器代码:
var radio = require("radio-stream");
var http = require('http');
var url = "http://67.205.85.183:7714";
var stream = radio.createReadStream(url);
var clients = [];
stream.on("connect", function() {
console.error("Radio Stream connected!");
console.error(stream.headers);
});
// When a chunk of data is received on the stream, push it to all connected clients
stream.on("data", function (chunk) {
if (clients.length > 0){
for (client in clients){
clients[client].write(chunk);
};
}
});
// When a 'metadata' event happens, usually a new song is starting.
stream.on("metadata", function(title) {
console.error(title);
});
// Listen on a web port and respond with a chunked response header.
var server = http.createServer(function(req, res){
res.writeHead(200,{
"Content-Type": "audio/mpeg",
'Transfer-Encoding': 'chunked'
});
// Add the response to the clients array to receive streaming
clients.push(res);
console.log('Client connected; streaming');
});
server.listen("8000", "127.0.0.1");
console.log('Server running at http://127.0.0.1:8000');
我的客户代码很简单:
<audio controls src="http://localhost:8000/"></audio>
这在Mac上的Safari 5中可以正常运行,但在Chrome或Firefox中似乎无法执行任何操作。 有任何想法吗?
可能的候选对象包括编码问题,或者只是部分实现的HTML5功能...
我正在尝试获得适用于Django(1.2)的流响应的“ hello world”。 我弄清楚了如何使用发电机和yield
函数。 但是响应仍然没有流式传输。 我怀疑其中有一个中间件-也许是ETAG计算器? 但是我不确定如何禁用它。 有人可以帮忙吗?
这是到目前为止的流媒体“ hello world”:
def stream_response(request):
resp = HttpResponse( stream_response_generator())
return resp
def stream_response_generator():
for x in range(1,11):
yield "%s\n" % x # Returns a chunk of the response to the browser
time.sleep(1)
我想制作一个简单的服务器应用程序,使人们可以使用基于浏览器的客户端(稍后将进行说明)进行连接以观看流式视频。 而且我想使用C#。
我需要通过网络摄像头捕获视频或快速图像并通过网络发送它们,该怎么办?
我使用以下代码将大型文件从Internet流化为本地文件:
fp = open(file, 'wb')
req = urllib2.urlopen(url)
for line in req:
fp.write(line)
fp.close()
这可行,但下载速度很慢。 有没有更快的方法? (文件很大,所以我不想将它们保留在内存中。)
我正在考虑开发流服务器,并且我有以下问题,可以通过RTSP(示例网址:RTSP
)或RTP
(示例网址:rtp://192.168.0.184
)来解决。
据我了解,RTSP
服务器主要用于流式传输已存在的文件,即不存在的文件。 RTP
服务器用于广播。
如果我错了,有人纠正我,对吗?
我想开发一种服务器来在计算机屏幕上广播实时内容,即在流式传输时显示的内容。
对于我正在开发的应用程序,我需要允许用户通过我们的网站上传非常大的文件,即可能要上传的数千兆字节。 不幸的是,ASP.NET MVC似乎在开始为请求提供服务之前将整个请求加载到RAM中-对于这样的应用程序并不完全理想。 值得注意的是,尝试通过以下代码来规避此问题:
if (request.Method == "POST")
{
request.ContentLength = clientRequest.InputStream.Length;
var rgbBody = new byte[32768];
using (var requestStream = request.GetRequestStream())
{
int cbRead;
while ((cbRead = clientRequest.InputStream.Read(rgbBody, 0, rgbBody.Length)) > 0)
{
fileStream.Write(rgbBody, 0, cbRead);
}
}
}
无法避开将请求缓冲到RAM的思路。 有一种简单的方法来解决此问题?
我正在尝试使用MPMoviePlayerController传输一些youTube视频,但我遇到了一些问题。 我正在使用的代码非常简单,我可以通过将URL传递给initWithContentURL来播放.m4v视频。 当我启动电影播放器时,播放器出现但在大约20秒后消失。 当我在模拟器中尝试它时,我得到一个警告视图,说明服务器配置不正确。 我是否需要通过URL传递来自谷歌的特定类型的视频源?
NSURL *videoURL = [NSURL URLWithString:@"http://www.youtube.com/v/HGd9qAfpZio&hl=en_US&fs=1&"];
MPMoviePlayerController *moviePlayer;
moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:videoURL];
[moviePlayer play];
我也尝试过以下网址[http://www.youtube.com/watch?v=HGd9qAfpZio]
I have also seen the argument &format=1 and tried to add that to the end of both of the strings but no luck.
使用RESTful服务,您可以创建,读取,更新和删除资源。 当您处理类似数据库资产的事情时,这一切都很有效 - 但这又如何转化为流数据? (或者是吗?)例如,在视频的情况下,将每个帧视为我应该一次查询一个资源的资源似乎很愚蠢。 相反,我会设置套接字连接并流式传输一系列帧。 但这会打破RESTful范式吗? 如果我想能够快退或快进流怎么办? 这是RESTful范式内的可能吗? 那么:流媒体资源如何适应RESTful范式?
作为一个实施问题,我正准备创建这样一个流数据服务,我想确保我做的最好的方式&#34;。 我确定此问题之前已经解决过了。 有人能指出我的好材料吗?
我想知道在流媒体视频方面它们之间是否存在差异。
我知道VideoView
可以用于流式传输,什么是MediaPlayer
? 据我所知,MediaPlayer
可以做同样的事情VideoView
对吗?
任何人都可以给我答案吗?
如果我想通过RTSP到Android来从服务器流式传输视频,我应该从哪个开始? VideoView
或MediaPlayer
?
有什么建议吗?
我有一个浏览器游戏,我最近开始为游戏添加音频。
Chrome不会加载整个页面并且卡在"91 requests | 8.1 MB transferred"
并且不会加载任何更多内容,甚至会在所有其他选项卡中对网站进行制动Waiting for available socket
。
5分钟后(确切地)加载数据。
这不会发生在任何其他浏览器上。
删除一个MP3文件(最新添加的一个)修复了问题,所以我猜它是一个数据限制问题?
我已经在互联网上搜索了几天如何通过WiFi连接从Android手机到另一个Android手机实现视频流功能,但我似乎无法找到任何有用的东西。 我看了Android开发人员的示例代码,stackoverflow,谷歌,Android博客,但没有。 我能找到的是用于流媒体的某种电话到桌面或桌面到电话的解决方案,但我在实现中无需借用。
我需要使用arduino ADK控制机器人,因此我使用2个电话,一个将安装在机器人上,另一个将接收来自机器人的视频流。 我提到这个是因为我试图在广播时间和观看时间之间实现最小的延迟。
我正在编写2个应用程序,一个用于控制机器人的主应用程序(来自手持电话),它将控制从应用程序并接收流,以及第二个从应用程序,它将在机器人绑定的手机上运行,控制电机/执行器 /流媒体到主应用程序。 不幸的是,我不能使用第三方应用程序。 我需要将视频流代码集成到我的2个应用程序中。
实现这一目标有哪些选择? 这也很难做到,因为我从未使用过视频流,我在Java和Android开发方面做得非常好。 我应该如何编码/解码流,如何启动连接,是否需要使用UDP而不是TCP / IP? 我真的不知道从哪里开始,没有任何示例代码。 我很确定这可以实现。 我找不到任何有用的东西让我开始朝着正确的方向前进。
我偶然发现spydroid,但它在桌面上使用VLC,所以对我没有好处。
编辑:查看Cagney Moreau的博客。 他详细介绍了如何实现这一点。
我正在尝试设置一个非常基本的html5页面来加载一个20MB的.mp4视频。 看起来浏览器需要下载整个内容,而不仅仅是播放视频的第一部分和其他内容的流媒体。
这篇文章是我在搜索时发现的最接近的东西......我尝试过Hand Brake和Data Go Round,但两者似乎没有什么区别:
关于如何做到这一点或有可能的任何想法?
这是我正在使用的代码:
<video controls="controls">
<source src="/video.mp4" type="video/mp4" />
Your browser does not support the video tag.
</video>
我真的很难理解使用node.js将ffmpeg的实时输出流式传输到HTML5客户端的最佳方法,因为有很多变量在起作用,我在这个领域没有很多经验, 花了很多时间尝试不同的组合。
我的用例是:
1)IP视频摄像机RTSP H.264流由FFMPEG拾取并使用节点中的以下FFMPEG设置重新转换为mp4容器,输出到STDOUT。 这仅在初始客户端连接上运行,因此部分内容请求不会再次尝试生成FFMPEG。
liveFFMPEG = child_process.spawn("ffmpeg", [
"-i", "rtsp://admin:12345@192.168.1.234:554" , "-vcodec", "copy", "-f",
"mp4", "-reset_timestamps", "1", "-movflags", "frag_keyframe+empty_moov",
"-" // output to stdout
], {detached: false});
2)我使用节点http服务器捕获STDOUT并在客户端请求时将其流回客户端。 当客户端第一次连接时,我生成上面的FFMPEG命令行,然后将STDOUT流传递给HTTP响应。
liveFFMPEG.stdout.pipe(resp);
我还使用了流事件将FFMPEG数据写入HTTP响应,但没有任何区别
xliveFFMPEG.stdout.on("data",function(data) {
resp.write(data);
}
我使用以下HTTP标头(在流式传输预先录制的文件时也使用并工作)
var total = 999999999 // fake a large file
var partialstart = 0
var partialend = total - 1
if (range !== undefined) {
var parts = range.replace(/bytes=/, "").split("-");
var partialstart = parts[0];
var partialend = parts[1];
}
var start = parseInt(partialstart, 10);
var end = partialend ? parseInt(partialend, 10) : total; // fake a large file if no range reques
var chunksize = (end-start)+1;
resp.writeHead(206, {
'Transfer-Encoding': 'chunked'
, 'Content-Type': 'video/mp4'
, 'Content-Length': chunksize // large size to fake a file
, 'Accept-Ranges': 'bytes ' + start + "-" + end + "/" + total
});
3)客户端必须使用HTML5视频标签。
流式播放(使用带有206 HTTP部分内容的fs.createReadStream)到HTML5客户端没有问题,这个视频文件是先前用上面的FFMPEG命令行记录的(但保存到文件而不是STDOUT),所以我知道FFMPEG流 是正确的,我甚至可以在连接到HTTP节点服务器时正确地在VLC中看到视频直播。
然而,尝试通过节点HTTP从FFMPEG实时流式传输似乎要困难得多,因为客户端将显示一帧然后停止。 我怀疑问题是我没有设置HTTP连接以与HTML5视频客户端兼容。 我尝试了各种各样的事情,比如使用HTTP 206(部分内容)和200个响应,将数据放入缓冲区然后流式传输,没有运气,所以我需要回到第一个原则,以确保我设置正确 办法。
以下是我对这应该如何运作的理解,如果我错了,请纠正我:
1)应设置FFMPEG以对输出进行分段并使用空moov(FFMPEG frag_keyframe和empty_moov mov标志)。 这意味着客户端不使用moov原子,它通常位于文件的末尾,在流式传输时没有相关性(无文件末尾),但意味着没有寻求可能,这对我的用例来说很好。
2)即使我使用MP4片段并清空MOOV,我仍然必须使用HTTP部分内容,因为HTML5播放器将等到整个流在播放之前下载,而实时流永远不会结束,因此不可行。
3)我不明白为什么在实时流式传输时将STDOUT流传输到HTTP响应不起作用如果我保存到文件我可以使用类似代码轻松地将此文件流式传输到HTML5客户端。 也许这是一个时间问题,因为FFMPEG产生启动,连接到IP摄像机并将块发送到节点需要一秒钟,节点数据事件也是不规则的。 但是,字节流应该与保存到文件完全相同,HTTP应该能够满足延迟。
4)当从相机流式传输FFMPEG创建的MP4文件时,从HTTP客户端检查网络日志时,我看到有3个客户端请求:视频的一般GET请求,HTTP服务器返回大约40Kb,然后是部分 内容请求,文件的最后10K的字节范围,然后是未加载的中间位的最终请求。 也许HTML5客户端收到第一个响应后,要求文件的最后一部分加载MP4 MOOV原子? 如果是这种情况,它将无法用于流式传输,因为没有MOOV文件且文件没有结尾。
5)当尝试流式传输时检查网络日志时,我得到一个中止的初始请求,只收到大约200个字节,然后重新请求再次中止200字节,第三个请求只有2K长。 我不明白为什么HTML5客户端会中止请求,因为字节流与从录制文件流式传输时可以成功使用的字节流完全相同。 似乎节点没有将其余的FFMPEG流发送到客户端,但我可以在.on事件例程中看到FFMPEG数据,因此它将进入FFMPEG节点HTTP服务器。
6)虽然我认为将STDOUT流传递给HTTP响应缓冲区应该可以工作,但我是否必须构建一个中间缓冲区和流,这将允许HTTP部分内容客户端请求正常工作,就像它(成功)读取文件时一样? 我认为这是我遇到问题的主要原因,但我并不完全确定Node如何最好地设置它。 而且我不知道如何处理文件末尾的数据的客户端请求,因为没有文件结束。
7)我是否在尝试处理206个部分内容请求时处于错误的轨道上,并且这应该与正常的200个HTTP响应一起工作吗? HTTP 200响应适用于VLC,所以我怀疑HTML5视频客户端只能处理部分内容请求?
由于我还在学习这些东西,很难通过这个问题的各个层面(FFMPEG,节点,流媒体,HTTP,HTML5视频),所以任何指针都将非常感激。 我花了几个小时研究这个网站和网络,我没有遇到任何能够在节点中进行实时流媒体的人,但我不能成为第一个,我认为这应该可以工作(不知何故!)。