默认情况下,m3u8文件可以在Mac Safari浏览器中播放,但不能在任何其他桌面浏览器中播放.在所有浏览器中都需要做些什么来支持HTML5和非HTML5?
看来ffmpeg现在有一个分段器,或者至少有一个命令行选项
-f段
在文档中.
这是否意味着我可以使用ffmpeg实时将视频转码为h.264并使用ffmpeg单独提供分段的IOS兼容.m3u8流?如果是这样,将任意视频文件转码为分段的h.264 aac 640 x 480流ios兼容流的命令是什么?
我们有一个提供商,为HLS流提供m3u8文件(最初用于iOS应用程序).
Android 3.0+支持http直播(http://developer.android.com/guide/appendix/media-formats.html) - 我们实际上可以使用Android 3.0+上的标准VideoView播放这些m3u8文件.
编辑:Android似乎将此视为"实时"视频Feed,并禁用查找或计算视频时长的功能.(在iOS中,你可以在流中搜索而没有问题)
有没有办法迫使android 3.0+在这些文件中寻找?
以下是其他人要测试的示例活动:
import android.app.Activity;
import android.os.Bundle;
import android.widget.MediaController;
import android.widget.VideoView;
public class SandboxActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
VideoView vw = (VideoView) findViewById(R.id.videoView);
vw.setVideoPath("http://devimages.apple.com/iphone/samples/bipbop/gear4/prog_index.m3u8");
vw.setMediaController(new MediaController(this));
vw.requestFocus();
vw.start();
}
}
Run Code Online (Sandbox Code Playgroud)
和样本布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center" android:id="@+id/root">
<VideoView
android:id="@+id/videoView"
android:layout_width="wrap_content"
android:layout_height="match_parent" />
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
这是使用Apple的示例HLS链接.
我想直播视频,它是m3u8格式.所以我尝试了下面的代码
public class StreamingPlayer extends Activity implements
OnBufferingUpdateListener, OnCompletionListener,
OnPreparedListener, OnVideoSizeChangedListener, SurfaceHolder.Callback{
private static final String TAG = StreamingPlayer.class.getSimpleName();
private int mVideoWidth;
private int mVideoHeight;
private MediaPlayer mMediaPlayer;
private SurfaceView mPreview;
private SurfaceHolder holder;
private String path;
private boolean mIsVideoSizeKnown = false;
private boolean mIsVideoReadyToBePlayed = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.mediaplayer_2);
mPreview = (SurfaceView) findViewById(R.id.surface);
holder = mPreview.getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
private void playVideo() {
doCleanUp();
try {
/*
* TODO: …Run Code Online (Sandbox Code Playgroud) 使用jPlayer开发了一个互联网广播流媒体,它使用带有jQuery的html5音频标签,并为不支持的浏览器提供闪回功能.在iPhone(iOS 5.0.1)上测试播放器后,我们遇到了一个非常特殊的问题.
当iPhone连接到WiFi时,它使用HE-AAC V2流@ 64kbps 44.1kHz(苹果产品的首选编解码器)完美地流式传输.然而,当iPhone连接到3G移动网络时,它会"断续续续"或每1-2分钟停止流动1-2秒(不会完全停止流式传输).令人不安的是,当iPhone被迫以相同的比特率使用单独的MP3流时,它没有这个问题并且在3G上运行良好.
更新5
我们最近购买了3G/4G Sprint移动热点设备,并使用该设备测试了这个问题.当iPhone连接到移动热点时,它显示为连接到wifi设备,即使实际连接是通过3G/4G,也不会出现问题.这可能会回到iPhone不通过HTTP直播和直接连接到移动网络处理HE-AAC的问题.
更新4
将iPhone更新到iOS 5.1但问题仍然存在.
更新3
请阅读此处有关连接到移动网络时脚本无法正确呈现的各种问题.手指似乎指向可能插入代理以服务网页的移动网络运营商,例如用于缩小图像尺寸.它也可能会注入一些JavaScript页面.测试页面可以在这里找到 注意:此页面使用HE-AAC,因此它只适用于iPhone ...
UPDATE
根据Apple针对iOS设备的HTTP Live Streaming doc,"仅音频内容可以是MPEG-2传输,也可以是MPEG基本音频流,无论是采用ADTS标头的AAC格式还是MP3格式." 我们的音乐服务器使用OddcastV3编码器向icecastV2服务器发送三个流(MP3,HE-AAC V2和Oggvorbis).不确定编码器是否正在插入HE-AAC V2流的ADTS标头.有没有办法检查这个?
我有HLS播放列表,如下所示:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-PLAYLIST-TYPE:EVENT
#EXT-X-TARGETDURATION:10
#EXT-X-ALLOW-CACHE:NO
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:9.97667,
https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/fileSequence0.ts
#EXTINF:9.97667,
https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/fileSequence1.ts
#EXTINF:9.97667,
https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/fileSequence2.ts
#EXTINF:9.97667,
https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/fileSequence3.ts
Run Code Online (Sandbox Code Playgroud)
它们是EVENT类型的,意思是,当块变得可用时附加块,并且当所有块都存在时,#EXT-X-ENDLIST在末尾附加标记.
因此,当上传所有块时,我们最终得到一个类似于以下内容的播放列表:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-PLAYLIST-TYPE:EVENT
#EXT-X-TARGETDURATION:10
#EXT-X-ALLOW-CACHE:NO
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:9.97667,
https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/fileSequence0.ts
#EXTINF:9.97667,
https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/fileSequence1.ts
#EXTINF:9.97667,
https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/fileSequence2.ts
#EXTINF:9.97667,
https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/fileSequence3.ts
#EXTINF:9.97667,
https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/fileSequence4.ts
#EXTINF:9.97667,
https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/fileSequence5.ts
#EXT-X-ENDLIST
Run Code Online (Sandbox Code Playgroud)
我们在所有客户中都看到了奇怪的行为.如果您在iOS和Safari中打开m3u8播放列表,则在上传第一个块(或者甚至是3个块之后)时,播放器将开始播放视频.偶尔它会停止,但无法恢复.通常情况下,它甚至不会开始播放.
完全形成的播放列表(即带有#EXT-X-ENDLIST标签)完美播放.就在播放列表部分完成时.
我们尝试了各种各样的播放器:Quicktime,Safari,iOS,VLC,Flowplayer等.所有这些都有各种各样的问题,但这是最紧迫的.
任何洞察解决这个问题的方法都将非常感激.
编辑:我们尝试过HLS.js并且播放完美.这样一个不错的用户体验
编辑2:为了重现,我建议使用某种本地HTTP服务器(我使用python -m SimpleHTTPServer上面提供的播放列表.然后逐字地将文件附加到播放列表以模拟文件的上传,并观察播放器中断.
编辑3:好的,我已经构建了一个简单的测试工具来观察行为.https://github.com/dbousamra/m3u8-example运行node app.js然后open http://localhost:3001/playlist.m3u8在Safari或任何你想要的播放器中尝试.它应该可以播放,因为它是一个完整的播放列表.**
但是,如果添加一个查询参数?start=<some unix timestamp>,它将模拟事件的追加,每6秒一个块,从该时间戳开始,直到完成所有块,此时它将追加#EXT-X-ENDLIST一行.
示例网址: http://localhost:3001/playlist.m3u8?start=1460092250872
编辑5:我现在已经在Heroku上了解它:http://guarded-mesa-71212.herokuapp.com/playlist.m3u8?start =
Adobe HTTP Dynamic Streaming(HDS)的File Packager支持使用一个命令对视频文件进行分段和加密.
但是,我们有工作流需求,在加密这些文件之前,我们会对分段文件执行其他处理步骤.
使用HLS(HTTP实时流),这很容易做到,因为加密步骤使用AES-128加密,这是一种开放且广泛实施的加密方式.
这可能与HDS有关吗?基于对页面的简要阅读,它似乎不可能,但可能有其他知识证明我错了.
我有通过HLS传送的视频.现在我想在JavaScript中测试该设备是否真的可以在HTML5中播放HLS视频.
通常在Javascript中我做了类似的事情
document.createElement('video').canPlayType('video/mp4')
然而我无法弄清楚哪种'类型'是正确的HLS.
Apple的Safari HTML5音频和视频指南似乎建议使用"vnd.apple.mpegURL"("清单1-7回归到IE的插件")
<video controls>
<source src="HttpLiveStream.m3u8" type="vnd.apple.mpegURL">
<source src="ProgressiveDowload.mp4" type="video/mp4">
....
Run Code Online (Sandbox Code Playgroud)
但canPlayType("vnd.apple.mpegURL")即使在iOS设备上也能返回一个空字符串,它可以完美地播放实际的HLS流.
有没有办法检查没有"外部知识"的播放功能(例如"检查iOS用户代理并假设它可以播放hls")?
我知道我可以在元素中指定多个源,浏览器将使用第一个可播放的源.但是在我的情况下,我需要向JW Player提供一个我无法修改的URL.所以我需要从一组视频编码中找到"最佳可播放URL".(处理源选择的开源JS库虽然是一个很好的解决方法.)
任何人都可以建议如何MP4从HLS流构建文件(与您通常想要的相反)?说我有m3u8 - 是否有一种直接的方式来获得一个MP4使用FFMPEG或其他工具?
我想将输入视频的关键帧间隔设置为5秒.只有这样我才能使用FFmpeg实现恒定的5秒HLS分割.如何使用FFmpeg将关键帧间隔设置为5秒?(FFmpeg提示行代码赞赏)