原因:

pkt->stream_index < 0 || pkt->stream_index >= s->nb_streams

s是AVFormatContext  *ofmt_ctx;

1.av_write_frame()

av_write_frame()用于输出一帧视音频数据,它的声明位于libavformat\avformat.h,如下所示。

int av_write_frame(AVFormatContext *s, AVPacket *pkt); 
  • 1
简单解释一下它的参数的含义:s:用于输出的AVFormatContext。pkt:等待输出的AVPacket。函数正常执行后返回值等于0。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

av_write_frame()的定义位于libavformat\mux.c,如下所示。

    int av_write_frame(AVFormatContext *s, AVPacket *pkt)  {  int ret;  ret = check_packet(s, pkt);  if (ret < 0)  return ret;  //Packet为NULL,Flush Encoder  if (!pkt) {  if (s->oformat->flags & AVFMT_ALLOW_FLUSH) {  ret = s->oformat->write_packet(s, NULL);  if (s->flush_packets && s->pb && s->pb->error >= 0 && s->flags & AVFMT_FLAG_FLUSH_PACKETS)  avio_flush(s->pb);  if (ret >= 0 && s->pb && s->pb->error < 0)  ret = s->pb->error;  return ret;  }  return 1;  }  ret = compute_pkt_fields2(s, s->streams[pkt->stream_index], pkt);  if (ret < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))  return ret;  //写入  ret = write_packet(s, pkt);  if (ret >= 0 && s->pb && s->pb->error < 0)  ret = s->pb->error;  if (ret >= 0)  s->streams[pkt->stream_index]->nb_frames++;  return ret;  }  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

从源代码可以看出,av_write_frame()主要完成了以下几步工作: 
(1)调用check_packet()做一些简单的检测 
(2)调用compute_pkt_fields2()设置AVPacket的一些属性值 
(3)调用write_packet()写入数据

下面分别看一下这几个函数功能。 
check_packet() 
check_packet()定义位于libavformat\mux.c,如下所示。

    static int check_packet(AVFormatContext *s, AVPacket *pkt)  {  if (!pkt)  return 0;  if (pkt->stream_index < 0 || pkt->stream_index >= s->nb_streams) {  av_log(s, AV_LOG_ERROR, "Invalid packet stream index: %d\n",  pkt->stream_index);  return AVERROR(EINVAL);  }  if (s->streams[pkt->stream_index]->codec->codec_type == AVMEDIA_TYPE_ATTACHMENT) {  av_log(s, AV_LOG_ERROR, "Received a packet for an attachment stream.\n");  return AVERROR(EINVAL);  }  return 0;  }  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

从代码中可以看出,check_packet()的功能比较简单:首先检查一下输入的AVPacket是否为空,如果为空,则是直接返回;然后检查一下AVPacket的stream_index(标记了该AVPacket所属的AVStream)设置是否正常,如果为负数或者大于AVStream的个数,则返回错误信息;

compute_pkt_fields2() 
compute_pkt_fields2()主要有两方面的功能:一方面用于计算AVPacket的duration, dts等信息;另一方面用于检查pts、dts这些参数的合理性(例如PTS是否一定大于DTS)

AVOutputFormat->write_packet() 
write_packet()函数最关键的地方就是调用了AVOutputFormat中写入数据的方法。如果AVPacket中的flag标记中包含AV_PKT_FLAG_UNCODED_FRAME,就会调用AVOutputFormat的write_uncoded_frame()函数;如果不包含那个标记,就会调用write_packet()函数。write_packet()实际上是一个函数指针,指向特定的AVOutputFormat中的实现函数。

2.av_write_trailer()

av_write_trailer()用于输出文件尾,它的声明位于libavformat\avformat.h,如下所示。

int av_write_trailer(AVFormatContext *s);  
  • 1

它只需要指定一个参数,即用于输出的AVFormatContext。 
函数正常执行后返回值等于0。 
av_write_trailer()的定义位于libavformat\mux.c,如下所示。

    int av_write_trailer(AVFormatContext *s)  {  int ret, i;  for (;; ) {  AVPacket pkt;  ret = interleave_packet(s, &pkt, NULL, 1);  if (ret < 0)  goto fail;  if (!ret)  break;  //写入AVPacket  ret = write_packet(s, &pkt);  if (ret >= 0)  s->streams[pkt.stream_index]->nb_frames++;  av_free_packet(&pkt);  if (ret < 0)  goto fail;  if(s->pb && s->pb->error)  goto fail;  }  fail:  //写文件尾  if (s->oformat->write_trailer)  if (ret >= 0) {  ret = s->oformat->write_trailer(s);  } else {  s->oformat->write_trailer(s);  }  if (s->pb)  avio_flush(s->pb);  if (ret == 0)  ret = s->pb ? s->pb->error : 0;  for (i = 0; i < s->nb_streams; i++) {  av_freep(&s->streams[i]->priv_data);  av_freep(&s->streams[i]->index_entries);  }  if (s->oformat->priv_class)  av_opt_free(s->priv_data);  av_freep(&s->priv_data);  return ret;  }  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

从源代码可以看出av_write_trailer()主要完成了以下两步工作:

(1)循环调用interleave_packet()以及write_packet(),将还未输出的AVPacket输出出来。

(2)调用AVOutputFormat的write_trailer(),输出文件尾。

AVOutputFormat->write_trailer() 
AVOutputFormat的write_trailer()是一个函数指针,指向特定的AVOutputFormat中的实现函数。

Invalid packet stream index相关推荐

  1. PyTorch出现RuntimeError: Function AddBackward0 returned an invalid gradient at index 1

    感谢下面这篇文章,问题解决了: https://blog.csdn.net/andyL_05/article/details/107952479 报错是这样的: RuntimeError: Funct ...

  2. java.sql.SQLException: Io 异常: Invalid Packet Lenght

    java.sql.SQLException: Io 异常: Invalid Packet Lenght 出错原因: 查看oracle的驱动包是否是class12.jar,如果是的话很可能是它造成的. ...

  3. java packetmaster_解决DBUtilExt工具类的jdbc的时“java.sql.SQLException: Io 异常: Invalid Packet Lenght”异常问题...

    一.异常描述 通过DBUtilExt工具类进行实现文本大字段读取readTemCLOB的时候,报"java.sql.SQLException: Io 异常: Bad packet type. ...

  4. 实战内容(13)- Invalid audio stream. Exactly one MP3 audio stream is required.

    目录 问题 解决 方法一 方法二 <音视频开发>系列-总览_liuzhen007的专栏-CSDN博客音视频开发涉及的内容非常多,本专栏大致从音频基础知识.视频基础知识.通用媒体协议.实战案 ...

  5. FFmpeg源代码简单分析:av_write_frame()

    ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...

  6. ffmpeg源码简析(六)编码-av_write_frame(),av_write_trailer()

    1.av_write_frame() av_write_frame()用于输出一帧视音频数据,它的声明位于libavformat\avformat.h,如下所示. int av_write_frame ...

  7. Android Audio代码分析7 - stream type

    在看AudioTrack代码的时候,我们看到,要创建一个AudioTrack对象,需要指定一个StreamType. 今天我们只把stream type相关的代码抽取出来,详细看看stream typ ...

  8. RuntimeError: Function CdistBackward returned an invalid gradient

    报错:RuntimeError: Function CdistBackward returned an invalid gradient at index 1 – got [2,7,7] but ex ...

  9. ffmpeg 源代码简单分析 : av_read_frame()

    ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...

最新文章

  1. 【M17】考虑使用缓式评估
  2. 硬件:笔记本电脑7大分类总结,看完你就明白了!
  3. C#编写不安全代码初探
  4. 加密相关(对称加密、非对称加密、信息摘要、数字签名、CA数字证书)
  5. java rmi接口 超时设置_Spring RMI客户端读超时设置 | 学步园
  6. JSP获取浏览者真实IP地址方法
  7. hql与sql的区别(转)
  8. java里程碑之泛型--泛型基本语法
  9. django批量修改table_python中Django视图(view)的详解(附示例)
  10. class with pointer
  11. CV领域的国际国内期刊会议介绍
  12. web项目接入指纹识别+识别过程信息推送
  13. 为什么程序员做外包会被瞧不起?
  14. 内存管理之页转换 virt_to_page
  15. session钝化活化
  16. 第22章:针对Cloze Tests基于Attention机制的的MRC领域开山之作:Teaching Machines to Read and Comprehend架构设计及完整源码实现
  17. C语言:最小数与数列第一个数交换
  18. 假期培训日记(数论)
  19. 微服务(一)--Common
  20. 标题相似度算法_一个简单的计算文章相似度功能!

热门文章

  1. 鸿蒙开发板能干什么,【鸿蒙开发板试用报告】用OLED板实现FlappyBird小游戏(中)...
  2. Java 使用匿名内部类在方法内部定义并启动线程
  3. python判断变量不为空_Python简洁方法
  4. 反编译得到的java文件好多错误 val$query什么意思_这部分代码有错么?一直提示输入框$(#msg).val()得到的值未定义...
  5. mysql常见死锁_MySQL死锁系列-常见加锁场景分析
  6. 在Java 17中偏向锁可算是废了
  7. 秒懂 CountDownLatch 与 CyclicBarrier 使用场景
  8. 是什么使你留在你的公司
  9. C语言32位数加一精简,一个简单的32位多任务操作系统的实现(1)
  10. 安装库_免费软件安装库