音视频系列技术之如何入门DEMO

系列步骤

  1. 做个简单的入口

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

     

3 .推流的实现

推流的实现,需要先搭建一个nginx + rtmp服务器,也不复杂,网上有很多详细的教程
推流后,本地可以用ffplay来查看推流的视频,也可以写个简单的h5页面查看

推流最末尾会报错,错误如下,google/baidu 找遍了所有的帖子,没找到原因

扫描二维码关注公众号,回复: 11347630 查看本文章
  1.   // 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命令推流

  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
  // 直接用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>

4 .iOS原生播放器的实现

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

  #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

文章有参考雷雷霄骅的博客

https://blog.csdn.net/leixiaohua1020/article/details/47071547

猜你喜欢

转载自blog.csdn.net/ajsliu1233/article/details/106551125