首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于ffmpeg协议的Mpegts数据包损坏

基于ffmpeg协议的Mpegts数据包损坏
EN

Stack Overflow用户
提问于 2022-10-31 20:31:15
回答 1查看 41关注 0票数 1

我试图在ffmpeg中使用concat protocol,如ffmpeg文档:https://trac.ffmpeg.org/wiki/Concatenate中所描述的那样

然而,在运行concat时,我收到了很多关于损坏数据包的错误,所以我担心这不是最好的方法。我的实际用例将涉及使用大量不同来源的视频在无人监督的情况下运行,所以我想确定它是可靠的。

concat demuxer方法在没有错误的情况下取得了成功,但花费的时间大约是原来的10倍。

复制步骤

下载大巴克兔:

代码语言:javascript
复制
wget https://download.blender.org/demo/movies/BBB/bbb_sunflower_1080p_30fps_normal.mp4

对30秒的块进行代码转换:

代码语言:javascript
复制
ffmpeg -i bbb_sunflower_1080p_30fps_normal.mp4 -ss '00:06:30' -t 30 -c:v libx264 -crf 18 bbb30.mp4

创建第二部分:

代码语言:javascript
复制
mkdir -p parts;
for i in $(seq -f "%02g" 0 29); do \
  ffmpeg \
    -i bbb30.mp4 \
    -ss "00:00:$i" -t 1 \
    -c:v libx264 -pix_fmt yuv420p -crf 18 \
    -bsf:v h264_mp4toannexb \
    -f mpegts \
    -y parts/$i.ts;
done

将所有部件组合到一个新的输出mp4中:

代码语言:javascript
复制
ffmpeg -y \
  -i "concat:parts/00.ts|parts/01.ts|parts/02.ts|parts/03.ts|parts/04.ts|parts/05.ts|parts/06.ts|parts/07.ts|parts/08.ts|parts/09.ts|parts/10.ts|parts/11.ts|parts/12.ts|parts/13.ts|parts/14.ts|parts/15.ts|parts/16.ts|parts/17.ts|parts/18.ts|parts/19.ts|parts/20.ts|parts/21.ts|parts/22.ts|parts/23.ts|parts/24.ts|parts/25.ts|parts/26.ts|parts/27.ts|parts/28.ts|parts/29.ts" \
  -c copy \
  output.mp4

Stderr对损坏的数据包有很多警告(在本例中,总是在dts =21300处):

代码语言:javascript
复制
[mpegts @ 0x555d172daa00] Packet corrupt (stream = 0, dts = 213000).
concat:parts/00.ts|parts/01.ts|parts/02.ts|parts/03.ts|parts/04.ts|parts/05.ts|parts/06.ts|parts/07.ts|parts/08.ts|parts/09.ts|parts/10.ts|parts/11.ts|parts/12.ts|parts/13.ts|parts/14.ts|parts/15.ts|parts/16.ts|parts/17.ts|parts/18.ts|parts/19.ts|parts/20.ts|parts/21.ts|parts/22.ts|parts/23.ts|parts/24.ts|parts/25.ts|parts/26.ts|parts/27.ts|parts/28.ts|parts/29.ts: corrupt input packet in stream 0

在我看来,最终的mp4看起来还不错,但很明显,ffmpeg对某些事情并不满意。有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2022-11-01 03:47:10

你可以忽略这些警告。

MPEG-TS容器中的数据包具有一个计数器字段,该字段与每个数据包一起递增。预计这些活动将持续进行。由于您将TS文件编码在单独的实例中,因此当从一个TS输入切换到另一个TS输入时,该计数器将以0开始。但是这在这个用例中没有显著的意义。这发生在concat协议中,因为使用单个TS demuxer实例将所有输入读入为一个合并的整体。该为每个输入打开一个新的TS查询器,然后将所有数据包拼接为一个单一流。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74268824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档