我正在开发一个自定义视频播放器来从服务器流式传输 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) 我已经设置了SDK附带的示例Web服务器(https://github.com/googlecast/),它可以使用它们提供的示例媒体文件.当我尝试使用示例m3u8文件时,它失败了:
{"code":"session_error","description":"LOAD_FAILED","details":null}`
Run Code Online (Sandbox Code Playgroud)
两个URL在Safari中加载正常.是否不支持此类流媒体?有没有办法获得更详细的错误消息.
我有.m3u8
链接,我需要发挥iOS
支持HLS Protocol
.
当我直接将URL分配给MPMoviePlayerController
和播放时,视频不可见,但我可以听到音频.
NSURL *movieURL = [NSURL URLWithString:@"http://qthttp.apple.com.edgesuite.net/1010qwoeiuryfg/sl.m3u8"];
MPMoviePlayerController *mp = [[MPMoviePlayerController alloc] initWithContentURL:movieURL];
[self.view addSubview:self.moviePlayer.view];
if (mp)
{
// save the movie player object
self.moviePlayer = mp;
[self.moviePlayer setFullscreen:YES];
// Play the movie!
[self.moviePlayer play];
}
Run Code Online (Sandbox Code Playgroud)
我还需要做些iOS
什么?
我正在尝试从iOS设备上的远程HLS(m3u8)流中解码音频样本,以便进一步处理数据,例如记录到文件.使用参考流http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8.
通过将AVURLAsset与AVPlayer结合使用,我可以在CALayer上将视频显示为预览.我还可以使用AVPlayerItemVideoOutput获取原始视频数据(CVPixelBuffer).音频也可以通过iOS设备的扬声器进行测量.
这是我目前用于AVURLAsset和AVPlayer的代码:
NSURL* url = [NSURL URLWithString:@"http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8"];
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil];
NSString *tracksKey = @"tracks";
[asset loadValuesAsynchronouslyForKeys:@[tracksKey] completionHandler: ^{
dispatch_async(dispatch_get_main_queue(), ^{
NSError* error = nil;
AVKeyValueStatus status = [asset statusOfValueForKey:tracksKey error:&error];
if (status == AVKeyValueStatusLoaded) {
NSDictionary *settings = @
{
(id)kCVPixelBufferPixelFormatTypeKey: @(kCVPixelFormatType_32BGRA),
@"IOSurfaceOpenGLESTextureCompatibility": @YES,
@"IOSurfaceOpenGLESFBOCompatibility": @YES,
};
AVPlayerItemVideoOutput* output = [[AVPlayerItemVideoOutput alloc] initWithPixelBufferAttributes:settings];
AVPlayerItem* playerItem = [AVPlayerItem playerItemWithAsset:asset];
[playerItem addOutput:output];
AVPlayer* player = [AVPlayer playerWithPlayerItem:playerItem];
[player setVolume: 0.0]; // no preview audio
self.playerItem = …
Run Code Online (Sandbox Code Playgroud) 我试图在一个网页上播放一个m3u8文件流与video.js,但我不能这样做,我不知道错误在哪里
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<title>Video</title>
<link href="http://vjs.zencdn.net/4.12/video-js.css" rel="stylesheet">
<script src="http://vjs.zencdn.net/4.12/video.js"></script>
<script src="https://github.com/videojs/videojs-contrib-media-sources/releases/download/v0.1.0/videojs-media-sources.js"></script>
<script src="https://github.com/videojs/videojs-contrib-hls/releases/download/v0.11.2/videojs.hls.min.js"></script>
</head>
<body>
<h1>Video</h1>
<video id="my_video_1" class="video-js vjs-default-skin" controls preload="auto" width="640" height="268"
data-setup='{}'>
<source src="http://iphone-streaming.ustream.tv/uhls/3064708/streams/live/iphone/playlist.m3u8" type='video/mp4'>
</video>
<script>
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud) 我有一个需求:在播放视频流(m3u8)之前获取帧图像,作为视频预览显示。我使用AVPlayerItemVideoOutpu copyPixelBufferForItemTime:itemTimeForDisplay:仅当播放视频流以获取帧图像时,您还有其他方法吗?谢谢!!
这是我的代码:
CMTime itemTime = self.playerItem.currentTime;
CVPixelBufferRef pixelBuffer = [_playerItemVideoOutput copyPixelBufferForItemTime:itemTime itemTimeForDisplay:nil];
CIImage *ciImage = [CIImage imageWithCVPixelBuffer:pixelBuffer];
CIContext *temporaryContext = [CIContext contextWithOptions:nil];
CGImageRef videoImage = [temporaryContext
createCGImage:ciImage
fromRect:CGRectMake(0, 0,
CVPixelBufferGetWidth(pixelBuffer),
CVPixelBufferGetHeight(pixelBuffer))];
UIImage *uiImage = [UIImage imageWithCGImage:videoImage];
CGImageRelease(videoImage);
NSLog(@"uiImage?%@", uiImage);
Run Code Online (Sandbox Code Playgroud) 我是用ffmpeg下载m3u8文件中的ts合并成mp4文件的?用下面的命令行?
ffmpeg -i <source m3u8 file> -c copy target.mp4
Run Code Online (Sandbox Code Playgroud)
虽然可以运行,但是我发现下载速度很慢,带宽利用率很低,所以想知道ffmpeg是否可以设置为多线程下载以加快下载速度?
我正在编写一个扩展程序以从网站下载视频。该网站有mp4
文件和m3u8
文件。我已经实现了直接下载mp4
文件的部分。我坚持将m3u8
文件转换为mp4
. 我尝试了很多js包,但是有很多依赖项,即使使用后也失败了browserfy
。
function loadvideoList(callback){
chrome.storage.sync.get(['courseID'], function(result) {
if(result.courseID != 'undefined'){
$.ajax({
type: 'GET',
url: "http://localhost:80/get_videos_list/"+result.courseID,
crossDomain: true,
success: function(response) {
document.getElementById("loading_icon").style.display='none';
document.getElementById("videos_list").style.display='block';
document.getElementById("videos_list").style.padding='10px';
for(var i = 0; i < response.video_list.length; i++){
if(response.video_list[i].type == 'mp4'){
handleDownloadButton(response.video_list[i]);
}else{
// ************ HERE ***************
handleDownloadButton-m3u8Tomp4(response.video_list[i].video_url)
}
}
},
error: function (err) {
alert("unexpected error occured: "+err.code);
console.log(err);
}
});
}else{
document.getElementById("videos_list").style.display='none';
document.getElementById("videos_list").style.padding='0';
}
});
}
function handleDownloadButton(json_vid){
var node …
Run Code Online (Sandbox Code Playgroud) 我有一个 .m3u8 网址,即http://example.com/test.m3u8
我可以通过ffmpeg命令下载它:
ffmpeg -y -loglevel verbose -i "http://example.com/test.m3u8" -c copy -f mpegts test.mp4
Run Code Online (Sandbox Code Playgroud)
但我正在尝试手动执行此操作:
我尝试了以下方法:
1)下载m3u8文件:
wget -O test.m3u8 "http://example.com/test.m3u8"
Run Code Online (Sandbox Code Playgroud)
2)然后将每个段下载到一个文件夹中:
aria2c -i test.m3u8
Run Code Online (Sandbox Code Playgroud)
这将下载文件夹中的所有 .ts 文件。
3)然后我把它们结合起来
cat *.ts > out.ts
Run Code Online (Sandbox Code Playgroud)
4)然后我尝试转换为mp4:
$ ffmpeg -i out.ts -c:v libx264 outputfilename.mp4
ffmpeg version 3.4.2 Copyright (c) 2000-2018 the FFmpeg developers
built with gcc 7.3.0 (GCC)
configuration: --prefix=/usr --disable-debug --disable-static --disable-stripping --enable-avisynth --enable-avresample --enable-fontconfig --enable-gmp --enable-gnutls --enable-gpl --enable-ladspa --enable-libass --enable-libbluray --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libiec61883 --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg …
Run Code Online (Sandbox Code Playgroud) 尝试使用 exoplayer v2.10.5 播放 m3u8 时变黑,这让我添加或如何使用 exoplayer v2.10.5 和 gradle 3.5.3 播放 m3u 或哪个版本的 exoplayer 可以与 api 28 和 gradle 3.5.3 配合使用
如果你能帮助我适应代码或解释它,那就更好了,我开始这样做,这将是一个帮助,mp4 播放没有问题。
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.WindowManager;
import com.google.android.exoplayer2.ExoPlayerFactory;
import com.google.android.exoplayer2.SimpleExoPlayer;
import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.source.ProgressiveMediaSource;
import com.google.android.exoplayer2.ui.PlayerView;
import com.google.android.exoplayer2.upstream.DataSource;
import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory;
import com.google.android.exoplayer2.util.Util;
import androidx.appcompat.app.AppCompatActivity;
/**
* A fullscreen activity to play audio or video streams.
*/
public class PlayerActivity extends AppCompatActivity {
private PlayerView playerView;
private SimpleExoPlayer player;
private boolean playWhenReady=true;
private long playbackPosition=0; …
Run Code Online (Sandbox Code Playgroud) m3u8 ×10
ios ×3
javascript ×3
ffmpeg ×2
android ×1
aria2 ×1
avfoundation ×1
avkit ×1
avplayer ×1
bash ×1
chromecast ×1
converters ×1
exoplayer2.x ×1
frame ×1
google-cast ×1
html5 ×1
iphone ×1
linux ×1
mp4 ×1
streaming ×1
swift ×1
video ×1
video.js ×1