前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >音视频技术(3)- 入门DEMO

音视频技术(3)- 入门DEMO

作者头像
公号sumsmile
发布2020-03-27 12:28:03
1.1K0
发布2020-03-27 12:28:03
举报
文章被收录于专栏:音视频技术学习笔记

断断续续花了一周的业余时间,完成了4个iOS端 ffmpeg demo的实现

  1. 做个简单的入口

image

  1. 接入ffmpeg编译好的库和头文件,打印configuration

image

  1. 推流的实现 推流的实现,需要先搭建一个nginx + rtmp服务器,也不复杂,网上有很多详细的教程 推流后,本地可以用ffplay来查看推流的视频,也可以写个简单的h5页面查看 推流最末尾会报错,错误如下,google/baidu 找遍了所有的帖子,没找到原因 // av_write_trailer(ofmt_ctx); 只能确定是这句代码有问题,应该是写流结尾出bug了, 可能是采用了老接口的问题 Error muxing packet [flv @ 0x12102c000] Failed to update header with correct duration. [flv @ 0x12102c000] Failed to update header with correct filesize. Error occurred.

也可以直接用ffmpeg命令推流

代码语言:javascript
复制
ffmpeg -re -i "/home/users/test.mp4" -vcodec libx264 -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -q 10 rtmp://xxxxx:1935/hls/test2
代码语言:javascript
复制
// 直接用ffplay接受流媒体数据
// ffplay -i rtmp://180.76.164.113:1935/hls/test2

// h5实现代码, 引用了hls库:
 <!DOCTYPE html>
<html>
<head>
    <title>rtmp</title>
    <meta charset="utf-8">
    <script src="https://cdn.jsdelivr.net/hls.js/latest/hls.min.js"></script>
</head>
<body>
    非的发达
    <video 
    autoplay="true"
    muted="muted"
    id="video"></video>
    <script>
        if (Hls.isSupported()) {
            var video = document.getElementById('video');
            var hls = new Hls();
            hls.loadSource('http://xxxxx/hls/test2.m3u8');
            hls.attachMedia(video);
            hls.on(Hls.Events.MANIFEST_PARSED, function(){
                video.play();
            })
        }  
    </script>
</body>
</html>
  1. iOS原生播放器的实现

image.png iOS对音视频的支持非常好,写个播放的demo,总共不到80行代码

代码语言:javascript
复制
#import "PlayViewController.h"
#import <MediaPlayer/MediaPlayer.h>
@interface PlayViewController ()
@property MPMoviePlayerController *moviePlayer;
@end

@implementation PlayViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self.moviePlayer play];
}

-(void)dealloc{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

-(MPMoviePlayerController *)moviePlayer{
    if(!_moviePlayer){
        NSString *urlStr = [[[NSBundle mainBundle]resourcePath] stringByAppendingPathComponent:@"resource.bundle/war3end.mp4"];
        NSURL *url = [NSURL fileURLWithPath:urlStr];
        _moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:url];
        _moviePlayer.view.frame = self.view.bounds;
        _moviePlayer.view.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
        [self.view addSubview:_moviePlayer.view];
    }
    return _moviePlayer;
}

-(void)addNotification{
    NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
    [notificationCenter addObserver:self selector:@selector(mediaPlayerPlaybackStateChange:) name:MPMoviePlayerPlaybackStateDidChangeNotification object:self.moviePlayer];
    [notificationCenter addObserver:self selector:@selector(mediaPlayerPlaybackfinished:) name:MPMoviePlayerPlaybackDidFinishNotification object:self.moviePlayer];
}

-(void)mediaPlayerPlaybackStateChange:(NSNotification *)notification{
    switch (self.moviePlayer.playbackState) {
        case MPMoviePlaybackStatePlaying:
            NSLog(@"正在播放...");
            break;
        case MPMoviePlaybackStatePaused:
            NSLog(@"暂停播放");
            break;
        case MPMoviePlaybackStateStopped:
            NSLog(@"停止播放");
            break;
        default:
            break;
    }
}

-(void)mediaPlayerPlaybackfinished:(NSNotification *)notification{
    NSLog(@"播放完成.%li", self.moviePlayer.playbackState);
}

@end
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云直播
云直播(Cloud Streaming Services,CSS)为您提供极速、稳定、专业的云端直播处理服务,根据业务的不同直播场景需求,云直播提供了标准直播、快直播、云导播台三种服务,分别针对大规模实时观看、超低延时直播、便捷云端导播的场景,配合腾讯云视立方·直播 SDK,为您提供一站式的音视频直播解决方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档