mp4-->ffm-->flv的问题描述

====

flags +global_header

codec:h264+aac

container trans: -codec copy

ffmpeg ts --> flv/ffm OK

remux  ts --> ffm OK

ffmpeg ts --> http:/feed1.ffm

播放时:

[07:21:02.155] [flv @ 0x1f22e30]Malformed AAC bitstream detected: use audio bitstream filter 'aac_adtstoasc' to fix it ('-bsf:a aac_adtstoasc' option with ffmpeg)

[07:21:02.155] Error writing frame to output for stream 'flv': Invalid data found when processing input

单独视频可以播放:

NoAudio

ffmpeg -re -i xx.ts -map 0:0  -override_ffserver -codec copy  -flags +global_header http://localhost:8090/feed1.ffm

rtsp封装无声音:

sdp.c: AAC with no global headers is currently not supported

1. 在解析配置文件时被初始化:

FFStream stream 和AVFormatContext类似,有

OutputFormat *fmt;

int nb_streams;

AVStream streams[];

2. build_feed_stream, 会write_header,写入文件/tmp/feed1.ffm,

但是这个header有问题:unspecified pixel format

(gdb) p feed->streams[1]->codec->pix_fmt

$7 = AV_PIX_FMT_NONE

3. 首次接收到数据时,把该数据的codec复制到c->stream->streams[i]->codec。

4. 首次发数据时,把c->stream->fmt/streams复制到c->fmt_ctx,

然后在fmt_ctx上write_header,写入c->pb_buffer。

remuxing xx.ts --> xx.flv 第4次后:

Malformed AAC bitstream

remuxing xx.mp4 --> xx.flv write_frame:

1. unspecified size, sample format

2. unspecified size

3--20. decoding for stream 0 failed

21之后正常。

remuxing xx.mp4 --> xx.ffm --> xx.flv

missing picture in access unit with size

no frames

unspecified size

ffmpeg xx.mp4 --> xx.ffm --> xx.flv也报错。

ffplay xx.ffm 只有声音,并且也是no frames

ffmpeg xx.mp4 --> xx.flv 正常

remuxing xx.mp4 --> xx.flv 也正常

能不能绕开ffm呢?

像这样

Format flv

File xx.flv

没有任何报错,可以正常播放。

能不能扩展到实时流呢?

模拟读文件,对于一个新的请求,

要给它发文件头,所以需要缓存文件头。

然后请求包,由于循环缓冲区等原因,会丢包。

remuxing 里面丢几个包试试。

丢前100个包, 可正常播放。

每30个包丢一个,ffplay 没有报错,在那个时间点部分马赛克,其他时间正常播放。

假设用例是这样的:

ffmpeg -i input http://localhost:8090/stream1.flv #只发数据

ffplay http://serverip:8090/stream1.flv #只收数据

ffmpeg为什么要走http?

目的是让ffserver统一管理socket io。

让ffmpeg原封不动的传包, ffserver收到后放到循环缓冲里面。

如果写文件的话,要设计一个ffm类似的文件格式,走老路上了。

收发的文件名一样?

以前不同是因为feed-stream设计是多对一的关系, ffserver要做封包的工作。

现在我们目前只需要一对一的关系,不用重新封包了。

发数据这块,用另外的端口,unix domain socket更好些,但是怎么让

ffmpeg原生地支持:

unix.c

unix://localhost:port/stream1.flv -timeout 1000 -type datagram

为了让ffserver知道数据大小?

到avio http这一层已经没有包的边界了。

如果在fferver端这样:保留http过来的前面几KB数据作为,剩下的循环缓存。

很可能会导致ffplay卡顿。

换个角度,我们把remuxing的read_frame,write_frame放到不同进程。

甚至让文件头信息也共享,这样就没有边界问题了,且不用转换和传输。

具体做法:

把remuxing.c复制两份,使用共享内存,建立一个固定的循环缓冲。

写端只管写,不用管读端;

读端读指针不能超过写指针。

#define PKT_BUF_SIZE 32

typedef struct{

AVFormatContext *ifmt_ctx;

AVFormatContext *ofmt_ctx;

AVPacket *pkt_buf[PKT_BUF_SIZE];

int wpos, rpos;

}share_data_t;

注意我们里面的很多指针也要在共享空间。

但是怎么 malloc from shared mem?

还有一种方案:

不要write_frame,而是avio_write(pkt);

定义一种所有AVFormat的超级格式.sff:

SFFx size data

x = 0表示循环写位置等元数据信息。

x = 1表示是write_header的内容,size 4个字节是后面data的长度。

x = 2表示后面的数据是AVPacket。

"SFF"本身是同步前缀码。

ffserver接收包要缓存,收到完整的包再输出。

因为ffserver里面读到开始的4096字节就read_header,以为codec就全部找到了。

实际上,从先前的demuxing可以看出,还需要读20个包, find_stream_info才能全部找到。

究竟多少个包才够找全呢?

重新设计配置文件。

先剪掉rtp, 以后再加进来。

Feed也不要

凡是关于codec opt都不要。

现在配置文件也不需要了。

剩下的需增加两个功能点:

o POST进来的文件名要记录,用它来关联以后的GET的连接。

o GET连接要维护自己的读指针。

o POST连接也有自己的写指针。

部署问题:

o 已经去掉了不需要的,ffserver在我的64bit ubuntu上仍然有4.4MB,

how to make ffmpeg small ?

o http输出不能chunked

设置输入参数:

av_dict_set(&stream->in_opts, "mpeg2ts_compute_pcr", "1", 0);

avformat_open_input(&infile, stream->feed_filename, stream->ifmt, &stream->in_opts)

设置输出参数:

AVDictionary *opts = NULL;

av_dict_set(&of->opts, "chunked_post", "0", 0);

avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE, NULL, &of->opts)

if(s->pb)avio_close(s->pb);

av_dict_free(&of->opts);

o remuxing 异常退出时没有看到ffserver关连接,里面的连接还在。

ffplay ctrl c 中断有, 那说明remuxing没有处理好。

我们处理办法是截获中断信号,avio时会主动查询到会返回AVERROR_EXIT。

其实发现remuxing正常退出,ffserver也没有断开连接,参考原始代码,

把接收长度为零就认为是断开的检查加上后,CLOSE_WAIT就变成正常的TIME_WAIT了。

这种方式,remuxing不用任何改动,就可以处理正常退出和中断退出两种情形。

但是这里有个问题是,remuxing在某种情形下就是不发数据,该怎么兼顾呢?

如果ffserver主动断开ffplay的GET连接,发现ffplay并没有退出,ffplay到ffserver的链路处于CLOSE_WAIT状态。

if(len <= 0)改成if(len < 0) ?

因为POST连接要占用缓存内存也不不小,还是主动断开更好些。

或者heart_beat/timeout/retry_times也可以考虑。

o remuxing 内存占用估计

每次处理一个包都要open_dyn_buf,之后释放掉,能不能只用一个最大的buf呢?

全局avio_open_dyn_buf/avio_close_dyn_buf一次。

每次处理包时,url_resetbuf/存取内部指针。

目前暂不优化,以后如果遇到内存不够时可以考虑这个方案。

c语言ffm是什么错误类型,FFM不能封装flv的问题和替代方案SFF相关推荐

  1. c语言abr是什么错误类型,C语言真他妈难

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 /* + + + + [ >i>n[t */ #include /*2w0,1m2,]_r>i>=>(['0n1'0)1; ...

  2. java程序错误类型及异常处理

    本文转载至:http://www.cnblogs.com/liaoliao/ 一.程序的错误类型 在程序设计中,无论规模是大是小,错误总是难免的.程序的设计很少有能够一次完成,没有错误的(不是指Hel ...

  3. 【程序设计】程序错误类型

    程序错误 如果程序在测试运行时遇到问题,我们必须调试,也就是说必须定位并排除错误,难度取决于错误的类型和程序员的调试技巧. 程序可能出现的两类基本错误类型是语法错误和逻辑错误. 语法错误 语法错误是指 ...

  4. Go语言内置的基础类型

    目录 1. 布尔类型 3. 浮点型 4. 复数类型 字符串遍历 字符类型 Go语言内置的基础类型 1. 布尔类型 关键字bool,可赋值为预定义的true和false,如:var v1 bool 布尔 ...

  5. OJ、ACM提交常见错误类型

    OJ.ACM提交常见错误类型 一.Presentation Error(输出格式错误) 主要换行或者空格使用错误造成的 , 出现Presentation Error说明思路没问题,很多时候就是和后台样 ...

  6. 1. Go语言顺序程序设计,错误处理

    变量 声明 Go语言的变量声明需要类型后置 var v1 int var v2 string var v3 [10]int // 数组 var v4 []int // 数组切片 初始化和赋值 var ...

  7. Go语言系列——31-自定义错误、32-panic和recover、33-函数是一等公民(头等函数)、34-反射、35-读取文件、36-写入文件

    文章目录 31-自定义错误 使用 New 函数创建自定义错误 使用 Errorf 给错误添加更多信息 使用结构体类型和字段提供错误的更多信息 使用结构体类型的方法来提供错误的更多信息 32-panic ...

  8. 初识C语言之详解char类型

    文章目录 一.预备知识 二.char类型 三.声明与初始化 1.声明 2.字符常量和初始化 3.非打印字符 一.预备知识 字符的定义:字符指类字形单位或符号,包括字母.数字.运算符号.标点符号和其他符 ...

  9. [日常] go语言圣经-声明,变量,赋值,类型,包和文件习题

    go语言圣经-声明 1.四种类型的声明语句:var.const.type和func,分别对应变量.常量.类型和函数实体对象的声明 2.包一级声明语句声明的名字可在整个包对应的每个源文件中访问,局部声明 ...

最新文章

  1. TensorFlow优化器及用法
  2. P3373 【模板】线段树 2 (未完待续)
  3. chrome web store的信息
  4. 20165114 《网络对抗技术》 Exp0 Kali安装与配置 Week1
  5. 三种平摊分析的方法分别为_干货|电工必须学会的三极管电路分析方法
  6. 重磅!全球Top 1000计算机科学家h指数公布:中国53位学者上榜!
  7. (42)Xilinx FIFO IP核配置(三)(第9天)
  8. python 如何运行程序
  9. Druid连接池jar包的下载 配置和简单使用
  10. maven配置smartupload_SmartUpload文件上传组件的使用教程
  11. 路由器技术彻底解决路由器IP地址冲突问题
  12. kangle安装php7.0_【Kangle】Linux下EasyPanel及PHP安装升级
  13. 服务器Ping值代表着什么?
  14. 滴滴:WebApp实践经验总结
  15. Maya获取材质ShadingEngine信息
  16. 坚果云同步的HTML编辑器,我的浏览器标签同步方案:坚果云+Floccus
  17. 2021-2027全球与中国厨房用食品搅拌机市场现状及未来发展趋势
  18. 【Redis】Redis入门篇(1)
  19. Kafka扩分区和分区副本重分配之后消费组会自动均衡吗?
  20. Error: Current license file does not support the EP4CE6E22C8 device问题解决

热门文章

  1. android studio防止反编译,防反编译利器-Android studio混淆代码压缩apk包体积
  2. 大班线描机器人_大班美术教案机器人
  3. excel python自动化_excel表自动化-python
  4. solr 高并发_预防帕金森病的运动并发症,比治疗更重要!
  5. java经典英文面试题,Java-英文面试题-经典
  6. Unity动画系统详解5:BlendTree混合树是什么?
  7. python3读取linux文件,Python3读取文件小技巧
  8. 计算机一级基础知识理论,计算机一级考试理论试题 第6部分 信息与计算机基础知识...
  9. 综合实例_为啥要做“三维管线综合”?看个实例就明白
  10. 带有进度报告的Angular 9/8多文件上传服务