使用 avconv => 损坏的视频从 jpeg 创建视频
Posted
技术标签:
【中文标题】使用 avconv => 损坏的视频从 jpeg 创建视频【英文标题】:Create a video from jpeg with avconv => corrupted video 【发布时间】:2012-07-20 15:41:05 【问题描述】:我正在尝试从一个充满 jpeg 帧的目录制作视频(无论格式如何)。
我尝试使用 avconv (v0.8),正如在互联网上的许多主题以及 libav 文档中看到的那样:
avconv -i samples/*.jpeg output.mpeg
它似乎运行良好并创建了 output.mpeg 文件。
但是任何阅读器(vlc、banshee、totem、...)都无法读取该文件。没有错误,但是当我按下播放时没有任何反应。
如果我检查视频文件大小,它大约是 20kB,而原始视频是 10MB。所以我们可以假设数据没有被存储到文件中(不管输入的帧数如何,它大约是 20kB)
我做了一个处理的调试日志的pastebin。我不熟悉编解码器世界,所以我不懂很多东西:http://pastebin.com/9dfxFWZe.
我也尝试了很多与-s,-r,-b,-vcodec,-f格式等的组合。但问题仍然存在。
我是不是做错了什么?
问我有什么可以帮助你的,我会很快回答的。
感谢您的帮助:)
【问题讨论】:
【参考方案1】:avconv 期望您以类似 printf 的语法给出输入文件名。仅使用 shell 通配符(如 samles/*.jpeg)是不够的。
您的示例似乎被命名为 sample/lapinsnipermin/.jpeg,因此请尝试以下命令行:
avconv -f image2 -i samples/lapinsnipermin/%03d.jpeg output.mpeg
这行得通吗?您可能还想为比特率添加选项(例如 -r 25)。
【讨论】:
感谢您的回答。根据日志,已成功找到 jpeg 文件(请参阅上面第 93 行发布的 Pastbin)。我尝试了许多选项组合,包括-r,但没有结果:(你能在日志中找到任何相关的东西吗?谢谢 另请注意,使用 %03d 时似乎存在一些约束,可能从零开始。因此,我有与 IMG_2550..2850.JPG 匹配的图像,但 IMG_%04d.JPG 不起作用,我必须重命名文件以从 IMG_0000.JPG 开始。 其实%03d使用的是C编程语言的printf函数的语法。它大致转换为零填充 (0) 三位数 (3) 十进制 (d)。您需要调整模式以适合您的文件名。 @Elby 当然!使用 -r 选项控制比特率。-r 25
会给你每秒 25 帧。使用较小的数字来增加播放时间。
@Gtx avconv 要求文件名在某处有一个从 0 增加到 #files-1 的数字。因此,除非 15、04 或 30 是这样的数字,否则这可能行不通。如果您不想重命名文件,并且在 unix 环境中工作,则可以使用以下命令创建一组符号链接:i=0; for f in *.jpg; do ln -s $f $(printf "%04d.jpg" $i); i=$((i+1)); done
【参考方案2】:
在谷歌搜索解决方案时出现此问题。我终于用这个来工作了:
knoppix@Microknoppix:~$ avconv -r 1 -i /tmp/photo%d.jpg -r 24 -s 320x240 -vsync cfr /tmp/video.mpg
我无法让 avconv 识别原始名称中的输入文件;这说明了原因:
knoppix@Microknoppix:~$ strace avconv -i /media/sdb1/DCIM/188_0408/IMGP%04d.JPG /tmp/video.mpg 2>&1 | grep 188_0408
execve("/usr/bin/avconv", ["avconv", "-i", "/media/sdb1/DCIM/188_0408/IMGP%0"..., "/tmp/video.mpg"], [/* 36 vars */]) = 0
stat64("/media/sdb1/DCIM/188_0408/IMGP0000.JPG", 0xbf925b00) = -1 ENOENT (No such file or directory)
stat64("/media/sdb1/DCIM/188_0408/IMGP0001.JPG", 0xbf925b00) = -1 ENOENT (No such file or directory)
stat64("/media/sdb1/DCIM/188_0408/IMGP0002.JPG", 0xbf925b00) = -1 ENOENT (No such file or directory)
stat64("/media/sdb1/DCIM/188_0408/IMGP0003.JPG", 0xbf925b00) = -1 ENOENT (No such file or directory)
stat64("/media/sdb1/DCIM/188_0408/IMGP0004.JPG", 0xbf925b00) = -1 ENOENT (No such file or directory)
write(2, "/media/sdb1/DCIM/188_0408/IMGP%0"..., 66/media/sdb1/DCIM/188_0408/IMGP%04d.JPG: No such file or directory
我没有看到设置起始编号的选项,所以我这样做了:
i=0; for file in /media/sdb1/DCIM/188_0408/IMGP28*.JPG; do cp $file /tmp/photo$i.jpg; i=$((i+1)); done
最终结果是我的照片的视频,每秒显示一个; -vsync cfr
告诉 avconv 填充输入帧以匹配输出帧率。
【讨论】:
根据another answer,由于avconv 9.x有-start_number
选项。【参考方案3】:
我发现最好将 jpg 文件通过管道传输到您想要的位置,这样您就可以使用标准通配符来控制选择,试试这样的方法。这也会输出一个您可以在网络和移动设备上使用的视频(即使用标准浏览器标签):
cat samples/*.jpeg | avconv -r 30 -f image2pipe -codec:v mjpeg -i - -pix_fmt yuvj420p -r 30 -c:v libx264 -vf scale=480:300 -y output.mp4
【讨论】:
以上是关于使用 avconv => 损坏的视频从 jpeg 创建视频的主要内容,如果未能解决你的问题,请参考以下文章
使用 avconv 从 .mov 转换为 .mp4(或 h264)