我正在开发一个视频流应用程序,并且在使用FileDescriptor调用set setDataSource时遇到困难.我希望我的应用程序在下载时播放视频,所以一旦我得到最小字节数,我将这些字节移动到另一个文件,这样它就可以在原始文件中下载时在另一个文件中播放.
所以,我检查一下我是否可以像这样启动每个数据包的媒体:
if (mediaPlayer == null) {
// Only create the MediaPlayer once we have the minimum
// buffered data
if (totalKbRead >= INTIAL_KB_BUFFER) {
try {
startMediaPlayer();
} catch (Exception e) {
Log.e(getClass().getName(),
"Error copying buffered conent.", e);
}
}
} else if (mediaPlayer.getDuration()
- mediaPlayer.getCurrentPosition() <= 1000) {
transferBufferToMediaPlayer();
}
}
Run Code Online (Sandbox Code Playgroud)
这是startMediaPlayer方法代码:
private void startMediaPlayer() {
try {
File bufferedFile = new File(context.getCacheDir(), "playingMedia"
+ (counter++) + ".dat");
// bufferedFile is the one that'll be played
moveFile(downloadingMediaFile, …Run Code Online (Sandbox Code Playgroud) 我想使用HTML5视频播放器并流式传输视频.S3/CloudFront可以实现吗?我了解亚马逊使用RTMP流媒体协议,而HTML5的video标签不支持RTMP.有没有办法用HTML5播放器流式传输视频?
我的主要目标是从服务器流式传输视频,并在流式传输时逐帧剪切(以便OpenGL可以使用它).为此,我使用了我在互联网上随处可见的代码(我记得它来自Apple的GLVideoFrame示例代码):
NSArray * tracks = [asset tracks];
NSLog(@"%d", tracks.count);
for(AVAssetTrack* track in tracks) {
NSLog(@"type: %@", [track mediaType]);
initialFPS = track.nominalFrameRate;
width = (GLuint)track.naturalSize.width;
height = (GLuint)track.naturalSize.height;
NSError * error = nil;
// _movieReader is a member variable
@try {
self._movieReader = [[[AVAssetReader alloc] initWithAsset:asset error:&error] autorelease];
}
@catch (NSException *exception) {
NSLog(@"%@ -- %@", [exception name], [exception reason]);
NSLog(@"skipping track");
continue;
}
if (error)
{
NSLog(@"CODE:%d\nDOMAIN:%@\nDESCRIPTION:%@\nFAILURE_REASON:%@", [error code], [error domain], error.localizedDescription, [error localizedFailureReason]);
continue;
}
NSString* key = (NSString*)kCVPixelBufferPixelFormatTypeKey; …Run Code Online (Sandbox Code Playgroud) 我正在进行活动
VideoView - 从网络服务器流式传输视频.
按钮 - 使用户进入下一个要显示的活动.
应用程序启动时,VideoView将从Web服务器播放视频.
现在假设
Total Video length is 60 Minutes
Current Video progress is 20 Minutes
Current Buffered progress 30 Minutes
Run Code Online (Sandbox Code Playgroud)
现在,当我点击上面提到的Button时,用户将进入下一个活动.
如果按下后退按钮,则从该活动开始,用户前面会显示"上一个活动"(带有VideoView和"按钮").但是当恢复时,视频的所有缓冲部分都会丢失,因此VideoView从一开始就播放视频,这真的很糟糕. < - 实际问题
问题
当Activity重新恢复时,视频的缓冲部分会丢失,因此会再次开始缓冲.那么如何克服重新缓冲视频的缓冲部分呢?
甚至官方Youtube Android应用程序.有同样的问题.
编辑1:
我在Activity中尝试了下面的代码,但它不起作用.
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
videoView.suspend();
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
videoView.resume();
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以指导我这个问题吗?或者我错过了一些能使这项工作完美的东西?
目前的解决方法
我已经用onPause()方法和onResume()方法保存了视频的当前播放位置,我已经使用该位置来寻找该持续时间的视频.这很好用.但是视频缓冲从一开始就从搜索位置开始视频开始.
非常感谢任何帮助.
android video-streaming android-video-player android-videoview
我有一台服务器通过RTSP(rtsp:// ...)在网络上提供实时H.264视频,我一直在努力寻找一种方法在浏览器中向用户显示流(至少在Windows和OS X - Linux是一个奖金).我目前已经嵌入了VLC播放器,并且在IE9和Mozilla Firefox 12.0中都可以使用它,但如果用户只需要为他们的浏览器安装一个插件或类似的东西(而不是整个程序),那将是理想的选择. .
我可以使用开源解决方案,但我不能使用任何GPL.Java applet或类似的东西是可能的.
到目前为止考虑的解决方案似乎不起作用:
我应该重新评估这些可能性吗?任何其他建议(例如在Flash或Silverlight中)将不胜感激.
谢谢!
编辑:在HTML5中获得解决方案真的很棒.
我试图让它在Android 4.1上运行(使用升级的Asus Transformer平板电脑).感谢Alex对我之前的问题的回答,我已经能够将一些原始的H.264数据写入文件,但是这个文件只能播放ffplay -f h264,而且似乎丢失了有关帧速率的所有信息(极快的播放).此外,色彩空间看起来不正确(atm使用摄像机默认的编码器侧).
public class AvcEncoder {
private MediaCodec mediaCodec;
private BufferedOutputStream outputStream;
public AvcEncoder() {
File f = new File(Environment.getExternalStorageDirectory(), "Download/video_encoded.264");
touch (f);
try {
outputStream = new BufferedOutputStream(new FileOutputStream(f));
Log.i("AvcEncoder", "outputStream initialized");
} catch (Exception e){
e.printStackTrace();
}
mediaCodec = MediaCodec.createEncoderByType("video/avc");
MediaFormat mediaFormat = MediaFormat.createVideoFormat("video/avc", 320, 240);
mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 125000);
mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 15);
mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar);
mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 5);
mediaCodec.configure(mediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
mediaCodec.start();
}
public void close() {
try {
mediaCodec.stop();
mediaCodec.release();
outputStream.flush();
outputStream.close();
} …Run Code Online (Sandbox Code Playgroud) 我们必须使用Android Camera捕获实时视频,并将它们发送到服务器,然后其他用户将通过浏览器或其他内容读取它们.
我在谷歌搜索和搜索,有一些关于视频流应用程序的例子,如:
1 Android-eye:https://github.com/Teaonly/android-eye
2 Spydroid-ipcamera:https://code.google.com/p/spydroid-ipcamera/
但是,它们似乎有不同的环境,大多数应用程序将启动HTTP服务器以进行流请求,然后客户端将通过本地网络访问该页面并查看视频.
那么视频流源和服务器都是这样的设备:

但我们需要像这样的互联网支持:

所以我想知道是否还有其他想法.
我想将视频从iPhone相机流式传输到Mac上运行的应用程序.想想视频聊天,但只有一种方式,从设备到接收器应用程序(它不是视频聊天).
到目前为止我的基本理解:
我对上述情况是对的还是我已经偏离了轨道?
Apple Tech Q&A 1702提供了一些关于将单个帧保存为图像的信息 - 这是最好的解决方法吗?只需保存30fps,然后像ffmpeg那样压缩它们?
有很多关于iPhone直播的讨论,但关于发送实时视频的人的信息要少得多.我希望有一些广泛的笔触让我指向正确的方向.
我有一个播放HLS视频流的AVPlayer.我的用户界面提供了一行按钮,一个用于视频中的每个"章节"(按钮标记为"1","2","3").该应用程序从服务器下载一些元数据,该服务器包含以秒表示的章节切入点列表.例如,一个视频的长度为12分钟 - 章节切入点的列表为0,58,71,230,530等,等等.
当用户点击其中一个"章节按钮"时,按钮处理程序代码执行以下操作:
[self.avPlayer pause];
[self.avPlayer seekToTime: CMTimeMakeWithSeconds(seekTime, 600)
toleranceBefore: kCMTimeZero
toleranceAfter: kCMTimeZero
completionHandler: ^(BOOL finished)
{
[self.avPlayer play];
}];
Run Code Online (Sandbox Code Playgroud)
其中"seekTime"是包含切入点的局部变量(如上所述).
问题是视频并不总是从正确的点开始.有时确实如此.但有时它会在请求的seekTime之前的任何时间从十分之一秒到2秒.它永远不会在请求的seekTime之后启动.
以下是视频编码的一些统计信息:
编码器:handbrakeCLI编解码器:h.264帧率:24(实际上,23.976 - 与拍摄方式相同)视频比特率:多比特率(64/150/300/500/800/1200)音频比特率:128k关键帧:23.976(每秒1次)
我当然使用Apple mediafilesegmenter工具和variantplaylistcreator来生成播放列表.
这些文件是从Amazon Cloud/S3存储桶提供的.
我仍然不清楚的一个领域是CMTimeMakeWithSeconds - 我已经根据我读过的不同文章/文档尝试了几种变体.例如,在上面的摘录我使用:
CMTimeMakeWithSeconds(seekTime,600)
我也尝试过:
CMTimeMakeWithSeconds(seekTime,1)
我不知道哪个是正确的,虽然两个似乎产生相同的不一致结果!
我也尝试过:
CMTimeMakeWithSeconds(seekTime,23.967)
有些文章声称这就像分子/分母一样,所以n/1应该是正确的,其中'n'是秒数(如CMTimeMakeWithseconds(n,1)).但是,代码最初是由一个不同的程序员(现在已经不在了)创建的,他使用600数字作为preferredTimeScale(即CMTimeMakeWithseconds(n,600)).
任何人都可以提供任何关于我做错的线索,或者即使我想要实现的那种准确性甚至可能吗?
如果有人想要提供"替代"解决方案,我们已经在考虑将视频分成不同的流,每章一个,但我们不相信这会给我们带来相同的性能,因为更改章节需要更长的时间因为新的AVPlayerItem必须被创建和加载等等,所以如果你认为这是唯一可行的解决方案(我们希望这将达到我们想要的结果 - 即每一章都会准确地开始我们想要的地方)随意说出来.
提前致谢!
我的网站上有视频倒带的问题.
我找出了http标题的问题.
我当前的控制器方法返回视频:
@RequestMapping(method = RequestMethod.GET, value = "/testVideo")
@ResponseBody
public FileSystemResource testVideo(Principal principal) throws IOException {
return new FileSystemResource(new File("D:\\oceans.mp4"));
}
Run Code Online (Sandbox Code Playgroud)
如何用字节范围支持重写以下代码?
我见过以下示例http://balusc.blogspot.in/2009/02/fileservlet-supporting-resume-and.html
但是这段代码看起来很难,我无法理解.我希望在春天mvc存在方式更简单.
video-streaming ×10
android ×4
ios ×3
avfoundation ×2
h.264 ×2
iphone ×2
amazon-s3 ×1
avplayer ×1
html5 ×1
html5-video ×1
http ×1
ios4 ×1
java ×1
media-player ×1
objective-c ×1
rtmp ×1
rtsp ×1
spring ×1
spring-mvc ×1
video ×1