欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-03 15:58:16
...

系列步骤

  1. 做个简单的入口

     

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

     

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

     

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

     

 

3 .推流的实现

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

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

  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原生播放器的实现

 

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

 

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