请教标准的MPEG4流如何封装成mp4格式的视频文件,用什么库之类

枫雨85 2011-05-02 12:16:51
DM355压缩的mpeg4流,如何封装为mp4格式的视频文件,网上竟是怎么解析的,想问怎么封装,用什么库啊,如果使用FFmpeg,请问怎么用啊,需要转码吗
...全文
681 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
elinchen88 2012-08-28
  • 打赏
  • 举报
回复
怎么把音频添加进去呢
「已注销」 2011-05-05
  • 打赏
  • 举报
回复
还是用mp4creator来生成.mp4文件吧
枫雨85 2011-05-04
  • 打赏
  • 举报
回复
能,我又用了MPEG4-IP编译出的mp4creator添加hint track,提示track id 0 doesn't exist;Couldn't create hint track:no media sample,我用ffmpeg查看过这个视频文件的信息,发现AVFormatContext的track属性确实为0,即没有
「已注销」 2011-05-04
  • 打赏
  • 举报
回复
这个文件能用暴风影音播吗
[Quote=引用 7 楼 leo_jy 的回复:]

原来是我忘了添加文件尾,添上个av_write_trailer()就好了。先谢谢了
不过这个文件用mp4box添加hint track时,弹出错误报告,强制关闭了,这是怎么回事?
[/Quote]
枫雨85 2011-05-04
  • 打赏
  • 举报
回复
本来是想用作流媒体点播的文件的,可是hint track不会加,就想先封装成MP4再用MP4BOX,这个东东还找不到源码,结果关键的一步就不行了,我用ffmpeg把原始mpeg4文件,转换成了mp4格式,文件本身小很多,但是也费时,但是mp4box可以添加hint track,太奇怪了
枫雨85 2011-05-04
  • 打赏
  • 举报
回复
原来是我忘了添加文件尾,添上个av_write_trailer()就好了。先谢谢了
不过这个文件用mp4box添加hint track时,弹出错误报告,强制关闭了,这是怎么回事?
「已注销」 2011-05-04
  • 打赏
  • 举报
回复
假设第一帧存放的缓冲地址为Buf,大小为nSize,则

memcpy(video_outbuf, Buf, nSize);
out_size = nSize;
if (out_size > 0) {
AVPacket pkt;
av_init_packet(&pkt);

if (c->coded_frame->pts != AV_NOPTS_VALUE)
pkt.pts= av_rescale_q(c->coded_frame->pts, c->time_base, st->time_base);
if(c->coded_frame->key_frame)
pkt.flags |= PKT_FLAG_KEY;
pkt.stream_index= st->index;
pkt.data= video_outbuf;
pkt.size= out_size;

/* write the compressed frame in the media file */
ret = av_interleaved_write_frame(oc, &pkt);
} else {
ret = 0;
}

如果是这样还不行,那不知哪里出错
枫雨85 2011-05-04
  • 打赏
  • 举报
回复
我按照3楼的说法尝试了,可以只是单纯的给原文件添加了个mp4文件头,而且好像还是之前用av_write_header()添加的,还不全,用av_open_input_file()打不开,提示缺少moov atom
CyberLogix 2011-05-03
  • 打赏
  • 举报
回复
mpeg4ip里面有个mp4creator的目录
「已注销」 2011-05-03
  • 打赏
  • 举报
回复
FFmpeg有个output_example.c,是个将yuv420的原始数据压缩成FFmpeg支持的文件格式(如mp4,avi等)的例子,你把yuv420压缩成mpeg4流的部分去掉,直接将mpeg4流写入目标文件即可

/* encode the image */
out_size = avcodec_encode_video(c, video_outbuf, video_outbuf_size, picture);
//此处avcodec_encode_video就不调用了,将mpeg4流写入 video_outbuf指向的内存,out_size为该帧的大小
/* if zero size, it means the image was buffered */
if (out_size > 0) {
AVPacket pkt;
av_init_packet(&pkt);

if (c->coded_frame->pts != AV_NOPTS_VALUE)
pkt.pts= av_rescale_q(c->coded_frame->pts, c->time_base, st->time_base);
if(c->coded_frame->key_frame)
pkt.flags |= PKT_FLAG_KEY;
pkt.stream_index= st->index;
pkt.data= video_outbuf;
pkt.size= out_size;

/* write the compressed frame in the media file */
ret = av_interleaved_write_frame(oc, &pkt);
} else {
ret = 0;
}
枫雨85 2011-05-02
  • 打赏
  • 举报
回复
请问mpeg4ip里哪个部分是关于mp4的封装,这个里面东西很多,很大,很杂。还有FFmpeg也是,光看到怎么转码了,也不知道具体封装应该用些什么
CyberLogix 2011-05-02
  • 打赏
  • 举报
回复
mpeg4ip或者FFMPEG

2,542

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧