需求: Android 端把网络摄像头的一段正在播放的视频流,截取保存成mp4(按录像按钮时开始录像)。

实现: ffmpeg + x264 + sdl;

h264 裸流 打包成MP4,在网上也有一大堆文章,ffmpeg 也有一个muxing 的 example,大致流程都是一样的,参考ffmpeg的muxing.c 就可以写一个。我这里把我在这个过程中遇到的问题写出来,这些问题困扰了我很久才解决,谁叫我是视频方面的小白呢。

这三个问题其实很简单,但如果对这方面不了解的话,耗掉的时间还是很多的。

1,dts,pts:

在write_frame()之前,每一个avpacket 数据都要设置 dts,pts,因为我的视频没有B帧,所以dts = pts 便可;pts 一开始我也不知道要怎么设, 参考muxing.c,设置成写入的帧数量便可(结合问题3);

2,sps,pps;

我接受到的裸流里面 sps  +pps + i帧 是放在一个NALU 里面的,在保存成mp4时这个sps 非常重要,我一开始没有设置,打包后的Mp4 普通的播放器就不能识别;

sps 在创建 编码器时候传递给编码器;     sps 是 00 00 00 01 后面的,不包含这个00 00 00 01 这个码;pps 我还没用到。

    case AVMEDIA_TYPE_VIDEO:c->codec_id = codec_id;LOGE("add_stream AVMEDIA_TYPE_VIDEO c->time_base.num = %d",ost->st->codec->time_base.num);c->bit_rate = 400000;/* Resolution must be a multiple of two. */c->width    = 352;c->height   = 288;/* timebase: This is the fundamental unit of time (in seconds) in terms* of which frame timestamps are represented. For fixed-fps content,* timebase should be 1/framerate and timestamp increments should be* identical to 1. */ost->st->time_base = (AVRational){ 1, STREAM_FRAME_RATE};//STREAM_FRAME_RATE };c->time_base       =ost->st->time_base;c->gop_size      = 12; /* emit one intra frame every twelve frames at most */c->pix_fmt       = STREAM_PIX_FMT;if (c->codec_id == AV_CODEC_ID_MPEG2VIDEO) {/* just for testing, we also add B frames */c->max_b_frames = 2;}if (c->codec_id == AV_CODEC_ID_MPEG1VIDEO) {/* Needed to avoid using macroblocks in which some coeffs overflow.* This does not happen with normal video, it just happens here as* the motion of the chroma plane does not match the luma plane. */c->mb_decision = 2;}c->extradata = spsinfo;c->extradata_size = 10;break;

3,fps:

在保存成mp4后,调试过程中各种fps都出来了,最后仔细看muxing.c ,发现其实要设置正确很简单:在pts 按1递增后,用一个很简单的函数就解决了这个问题。

c->time_base : 输入的帧率fps = 25 :{1,25},ost->st->time_base : 输出的帧率; 我这里设置和输入的一样就好了。

       packet->pts = (ptsInc++);;// * (90000/STREAM_FRAME_RATE);packet->dts = packet->pts;// packet->duration = 8/1000000;// packet->pos = -1;//ptsInc;av_packet_rescale_ts(packet, c->time_base, ost->st->time_base);

https://blog.csdn.net/xqt8888/article/details/43152529

h264 裸流打包成mp4 注意事项相关推荐

  1. ffmpeg实现将H264裸流封装成.mp4或.avi文件

    ffmpeg学习历程 由于我是移植到arm-linux环境(海思HI3521A),H264裸流直接从海思的编码模块VENC获取. H264数据流序列:    SPS, PPS, SEI, I, P, ...

  2. 将H264码流打包成RTP包

    分类: 流媒体(25) 版权声明:本文为博主原创文章,未经博主允许不得转载. H264码流打包成RTP包的代码如下: [cpp] view plaincopy #include <stdio.h ...

  3. H264码流打包成RTP包

    http://blog.csdn.net/tanningzhong/article/details/53281986 H264码流打包成RTP包的代码如下: [cpp] view plaincopy ...

  4. H264和音频流打包成PS流 (MPEG2-PS)

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 原文:https://blog.csdn.net/hiwubihe/article/details/80736848 [本系列相关文章] H26 ...

  5. H264和音频流打包成TS流 (MPEG2-TS)

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 原文:https://blog.csdn.net/hiwubihe/article/details/80865920 [本系列相关文章] H26 ...

  6. FFmpeg解码H264裸流并转换成opencv Mat

    感谢雷霄骅博士的在中文视频编解码的付出,http://blog.csdn.net/leixiaohua1020 最近要搞一些视频推流的事情,要解析H264裸流并且获取opencv格式的Mat数据给算法 ...

  7. H264码流打包分析(精华)

    H264码流打包分析 SODB 数据比特串-->最原始的编码数据 RBSP 原始字节序列载荷-->在SODB的后面填加了结尾比特(RBSP trailing bits 一个bit" ...

  8. RTSP再学习 -- 利用FFmpeg 将 rtsp 获取H264裸流并保存到文件中

    如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/78214267 既然已经可以通过 RTSP 获取h264 裸流了.那么通过 F ...

  9. 音视频开发(17)---RTSP再学习 -- 利用FFmpeg 将 rtsp 获取H264裸流并保存到文件中

    RTSP再学习 -- 利用FFmpeg 将 rtsp 获取H264裸流并保存到文件中 https://blog.csdn.net/qq_29350001/article/details/7821426 ...

最新文章

  1. Tslib移植与分析【转】
  2. 为什么集群要奇数_面试系列 redis数据删除amp;集群
  3. Careercup | Chapter 4
  4. U811.1接口EAI系列之一--通用把XML传送给EAI处理方法--PowerBuilder语言
  5. 《Redis深度历险:核心原理和应用实践》千帆竞发——分布式锁
  6. 【Python】ffmpeg模块处理视频、音频信息
  7. 分享一下我制作的Bat批处理程序-PC Tools(含源码)
  8. Spring学习-Bean的理解
  9. 回文联对联大全_回文对联大全
  10. popupwindow拦截点击物理返回键
  11. 《UVM实战卷Ⅰ》学习笔记 第五章 UVM验证平台的运行
  12. 微信闪退的修复方法分享
  13. python数据分析实战之超市零售分析
  14. win12服务器文件设置只读,高手亲自讲解win10文件夹只读属性改不了的修复办法...
  15. win10安装keras theano
  16. 行云管家:专注多云混合云,树立一站式云管平台行业标杆
  17. POI生成word文档,再通过spire.doc.free 实现word转pdf
  18. Type-c 充电听歌二合一转接器方案
  19. 三年硬件工程师薪水_关于“硬件工程师工资不高”的几个真相
  20. 用户和用户组变成了数字

热门文章

  1. Python2和Python3除法差别
  2. 超市管理系统java swing+mysql报告_基于java+swing+mysql的超市管理系统
  3. 前端篇--------1.css学习笔记
  4. 【多线程】C++11进行多线程开发 (std::thread)
  5. Android Studio如何发布APK
  6. 统计学习笔记(1)——统计学习方法概论
  7. Git远程:分支的upstream
  8. 编码练习——Java-8-输入/输出
  9. Serializable java序列化
  10. 美团O2O排序解决方案——线下篇