我正在尝试使用android mediaplayer类播放存储在我的SD卡中的本地m3u8文件.m3u8文件和.ts文件位于同一目录中.当我打开m3u8时,像MXPlayer这样的第三方播放器会加入ts文件并播放视频.但是使用android mediaplayer类会引发以下错误
无法创建媒体播放器错误:setDataSourceFD失败:status = 0x80000000 java.io.IOException:setDataSourceFD failed:status = 0x80000000 at android.media.MediaPlayer.setDataSource(Native Method)at android.media.MediaPlayer.setDataSource(MediaPlayer .java:1204)com.tcs.hlsvideo.StreamingPlayer.playVideo(StreamingPlayer.java:87)位于android.view.SurfaceView.updateWindow(SurfaceView. java:609)android.view.SurfaceView.access $ 000(SurfaceView.java:86)android.view.SurfaceView $ 3.onPreDraw(SurfaceView.java:178)android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:707) )在Android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1143)的android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1981)android.view.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java:4667)at android android.view.Choreographer.doCa .view.Choreographer $ CallbackRecord.run(Choreographer.java:725)llbacks(Choreographer.java:555)位于android.view.Choreographer.doFrame(Choreographer.java:525)的android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:711),位于android.os.Handler.handleCallback(Handler) .java:615)在Android.app.A.运行时,Android.A.Tharead.main(ActivityThread.java:4960)的android.os.Handler.dispatchMessage(Handler.java:92)在android.os.Looper.loop(Looper.java:137) at java.lang.reflect.Method.invokeNative(Native Method)at java.lang.reflect.Method.invoke(Method.java:511)at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java: 1038)在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)at dalvik.system.NativeStart.main(Native Method)setDataSourceFD failed:status = 0x80000000
我使用的代码是
private static final String TAG = StreamingPlayer.class.getSimpleName();
private String formatedIpAddress;
private int mVideoWidth;
private int mVideoHeight;
private MediaPlayer mMediaPlayer;
private SurfaceView mPreview;
private SurfaceHolder holder;
private String path;
//private boolean mIsVideoSizeKnown = false;
private boolean …Run Code Online (Sandbox Code Playgroud) 我正在使用AVPlayer播放HLS流.而且我还需要在用户按下记录按钮时记录这些流.我使用的方法是分别录制音频和视频,然后在最后合并这些文件以制作最终视频.并且它对远程mp4文件很成功.
但是现在对于HLS(.m3u8)文件,我能够使用AVAssetWriter录制视频,但是录音有问题.
我正在使用MTAudioProccessingTap处理原始音频数据并将其写入文件.我跟着这篇文章.我能够录制远程mp4音频,但它无法使用HLS流.最初我无法使用AVAssetTrack*audioTrack = [asset tracksWithMediaType:AVMediaTypeAudio] [0]从流中提取音轨.
但我能够使用KVO提取audioTracks来初始化MTAudioProcessingTap.
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
AVPlayer *player = (AVPlayer*) object;
if (player.status == AVPlayerStatusReadyToPlay)
{
NSLog(@"Ready to play");
self.previousAudioTrackID = 0;
__weak typeof (self) weakself = self;
timeObserverForTrack = [player addPeriodicTimeObserverForInterval:CMTimeMakeWithSeconds(1, 100) queue:nil usingBlock:^(CMTime time)
{
@try {
for(AVPlayerItemTrack* track in [weakself.avPlayer.currentItem tracks]) {
if([track.assetTrack.mediaType isEqualToString:AVMediaTypeAudio])
weakself.currentAudioPlayerItemTrack = track;
}
AVAssetTrack* audioAssetTrack = weakself.currentAudioPlayerItemTrack.assetTrack;
weakself.currentAudioTrackID = audioAssetTrack.trackID;
if(weakself.previousAudioTrackID != weakself.currentAudioTrackID) {
NSLog(@":::::::::::::::::::::::::: Audio track changed : %d",weakself.currentAudioTrackID);
weakself.previousAudioTrackID …Run Code Online (Sandbox Code Playgroud) 我们需要检测视频比特率上HLS与流ffprobe通过m3u8的文件.ts.
如果我使用m3u8,我可以获得持续时间,尺寸,使用的编解码器,音频比特率,但在提供的响应中没有可用的视频比特率ffprobe.
ffprobe -print_format json -show_format -show_streams -show_error http://gfrmedia-video-platform.s3.amazonaws.com/bumbia/2014/06/06/158217_20160126214307_bumbia-hls/hls1056k/158217_640x360-with-mp4-hls_bumbia-hls.m3u8
ffprobe version 2.8.3 Copyright (c) 2007-2015 the FFmpeg developers
built with Apple LLVM version 7.0.0 (clang-700.1.76)
configuration: --prefix=/usr/local/Cellar/ffmpeg/2.8.3 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-opencl --enable-libx264 --enable-libmp3lame --enable-libvo-aacenc --enable-libxvid --enable-vda
libavutil 54. 31.100 / 54. 31.100
libavcodec 56. 60.100 / 56. 60.100
libavformat 56. 40.101 / 56. 40.101
libavdevice 56. 4.100 …Run Code Online (Sandbox Code Playgroud) 如何在ios设备中存储来自url的所有块(.ts)的本地m3u8文件.如果可能的话怎么办呢?
我开发了类似的功能..在ios本地存储中下载带有块(.ts)的.m3u8文件,然后修改.m3u8后将播放离线模式.
如果对上述问题有任何解决方案,请帮助我.
请注意,SRS 支持为特定分辨率生成单独的 m3u8 文件。SRS 是否还支持为多种分辨率和比特率场景生成额外的主 m3u8 文件?
\n所需的母版 m3u8 示例:
\n#EXTM3U\n#EXT-X-VERSION:3\n#EXT-X-STREAM-INF:BANDWIDTH=2340800,RESOLUTION=960x540,CODECS=\xe2\x80\x9cavc1.4d401f,mp4a.40.2\xe2\x80\x9d\nindex_0.m3u8\n#EXT-X-STREAM-INF:BANDWIDTH=1170400,RESOLUTION=480x270,CODECS=\xe2\x80\x9cavc1.4d4015,mp4a.40.2"\nindex_1.m3u8\n#EXT-X-STREAM-INF:BANDWIDTH=677600,RESOLUTION=480x270,CODECS=\xe2\x80\x9cavc1.4d4015,mp4a.40.2\xe2\x80\x9d\nindex_2.m3u8\nRun Code Online (Sandbox Code Playgroud)\n 这里总新手所以,如果你能耐心等待我真的很感激.
现在我有了这个网址
http://213.202.73.8:1234/data/channels/ARENA1. m3u8
Run Code Online (Sandbox Code Playgroud)
我想将它嵌入到我的JW Player中,我有Jw Player 5和6所以无论什么都是最简单的,有人可以帮助兄弟,我需要嵌入什么代码,以便在可能的情况下在JW Player上播放.
如果你可以写完全代码,所以我可以理解,因为我说这里的新手,但快速学习者哈哈.
干杯伙计们
更新:
好的,所以我有一个小小的小提琴,看了一眼后想出了这个代码:
<script type='text/javascript' src='jwplayer2/jwplayer.js'></script>
<div id='mediaplayer'></div>
<script type="text/javascript">
jwplayer('mediaplayer').setup({
'id': 'playerID',
'width': '480',
'height': '270',
'file': 'http://213.202.73.8:1234/data/channels/ARENA1. m3u8',
'image': '/thumbs/bunny.jpg',
'modes': [
{type: 'html5'},
{type: 'flash', src: 'player.swf'},
{type: 'download'}
]
});
</script>
Run Code Online (Sandbox Code Playgroud)
所以它在野生动物园中工作非常出色,但不适用于Chrome,IE或Firefox,任何想法为什么,当我点击播放按钮与这些浏览器没有任何事情发生简单只是没有加载计时器类型的东西在播放器中间没有四处走动它试图在播放器中加载一些东西,但没有任何内容.
干杯伙计们
更新2:
如果它是指向该网站的链接,则为:http://testersite.byethost22.COM/test.html中
更新3:
我还尝试了另一个,这次它说"视频无法加载,因为服务器或网络失败或因为格式不受支持:"http://video.popler.tv:554/publish /ive/4funtv/playlist.m3u8"
你可以在这里看到:http:// testersite.byethost22.COM/U.html它虽然在safari中说这个,与Chrome之前一样的问题等但是现在当我点击chrome中的播放器它只是下载一个播放列表.m3u8
希望有人能帮忙,干杯
更新4:
好吧,如果你去这里:http://testersite.byethost22.com/test5.html并尝试用一个idevice来玩它你会看到它完美但但在我的电脑上使用chrome,firefox它根本不起作用,我很绝望现在伙计们,如果有人可以帮我把这个工作在chrome和firefox上,我会很有意思,也是一个非常快乐的快乐男人!正如我所说的要好jwp5或jwp6所以只要它适用于chrome和firefox我真的不介意.谢谢你们,请有人帮助大声笑,是的,我知道一些网址中的差距,但我必须这样做,因为我没有足够的声誉点发布超过2个链接.
我正在尝试使用node.js来传输HLS内容.不知怎的,它不起作用.如果有人帮助我,那将是非常有帮助的.
问题: - 尝试从node.js提供HLS内容(不是实时流,而是一组.ts文件和.m3u8播放列表,或者换句话说VOD内容)
文件夹结构
stream_test
|--- app.js
|--- node_modules
|--- streamcontent
|--- test.m3u8
|--- segment0.ts
|--- segment1.ts
.
.
.
|--- segment127.ts
Run Code Online (Sandbox Code Playgroud)
我app.js看起来像这样
var http = require('http'),
url = require('url'),
path = require('path'),
fs = require('fs');
var mimeTypes = {
"html": "text/html",
"jpeg": "image/jpeg",
"jpg": "image/jpeg",
"png": "image/png",
"js": "text/javascript",
"css": "text/css",
"ts": "video/MP2T",
"m3u8": "application/vnd.apple.mpegurl"};
http.createServer(function(req, res) {
var uri = url.parse(req.url).pathname;
var filename = path.join(process.cwd(), unescape(uri));
var stats;
console.log('filename '+filename);
try …Run Code Online (Sandbox Code Playgroud) 我很长时间以来一直面临这些问题,而且我对HLS的android支持感到非常失望,因为它的行为太随机了.
要求:
1)播放多个.m3u8视频流
2)应该在不同的设备和api级别上工作.
我所讨论的和各自的问题:
方法 - 1) 具有原生MediaPlayer的TextureView:
播放的视频数量取决于设备,对于某些设备,它只播放一个视频(My Device - samsung galaxy grand quattro - api level 16),对于某些设备,它可以播放所有四个视频流.
取决于api级别,一些.m3u8网址正在使用软糖而不是kitkat.
方法 - 2) ExoPlayer:
方法 - 3) Vitamio:
成功播放每个.m3u8网址
没有多视频视频的支持
方法 - 4) grafika:
我正在寻找的解决方案:
1)应该播放多个视频流,就像上述任何一种方法一样,我的设备可以播放单个视频,但似乎Milestone Mobile能够在我的设备中播放8个视频流(How?:O).
2)如果本机MediaPlayer无法播放某些.m3u8网址,那么如何调试确切的问题就像aac编解码器,解码器,段,.ts文件等有什么问题?
3)如果本机MediaPlayer无法播放流媒体,那么我该如何制作支持大多数流媒体网址的自定义MediaPlayer?
4)是否有可能与Vitamio一起播放多个视频?
5)符合我要求的任何其他HLS客户的参考?
就个人而言,我想选择Method-1,那么有什么我可以做的吗?
我需要解析m3u8媒体文件,这是一个播放列表,并下载实际的媒体内容.
根据我的理解,以下是涉及的过程:
不幸的是,我找不到任何lib /模块来执行上述步骤.任何人都可以提供更好的方法或工作样本来处理和下载m3u8文件吗?
任何帮助深表感谢.
我正在开发一个自定义视频播放器来从服务器流式传输 HLS 视频。我可以使用 AVPlayerItem 和 AVPlayer 成功播放 HLS 视频。
之后我想为我的视频播放器添加字幕轨道和音轨。所以我使用 AVMutableComposition 来做到这一点。所以现在的问题是,当我为 HLS 视频创建 AVURLAsset 时,我无法从 AVURLAsset 获取视频轨道。它总是给我 0 个曲目。我尝试了 AVURLAsset 的“loadValuesAsynchronously”,并尝试为 AVPlayerItem 的“轨道”添加 KVO。但这些都没有给我带来任何积极的结果。
我正在使用以下代码。
func playVideo() {
let videoAsset = AVURLAsset(url: videoURL!)
let composition = AVMutableComposition()
// Video
let videoTrack = composition.addMutableTrack(withMediaType: .video, preferredTrackID: kCMPersistentTrackID_Invalid)
do {
let tracks = videoAsset.tracks(withMediaType: .video)
guard let track = tracks.first else {
print("Can't get first video track")
return
}
try videoTrack?.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset.duration), of: track, at: kCMTimeZero)
} catch {
print(error)
return …Run Code Online (Sandbox Code Playgroud)