将压缩的 swf 转换为 mp4
Posted
技术标签:
【中文标题】将压缩的 swf 转换为 mp4【英文标题】:Convert compressed swf to mp4 【发布时间】:2013-12-10 05:59:45 【问题描述】:我正在寻找一个将 swf 无损转换为 mp4 的批处理脚本。我尝试同时使用 ffmpeg 和 handbrake,但显然 swf 已被压缩,我无法以这种方式转换它们。
ffmpeg -i input -c:v libx264 -preset ultrafast -qp 0 output.mkv
HandBrakeCLI -i source -o destination
我知道我使用像 xilisoft 这样的工具,但我有超过 3000 个视频,需要自动运行。是否有脚本/算法可以帮助我自动执行此过程?
【问题讨论】:
嗨 - 你有没有想过如何做到这一点?谢谢 Max- 还没有运气。现在我已经从供应商自己购买了另一个版本。 好的,谢谢! 填充> 我想可能有点晚了,但我想我发现了如何做到这一点。一会儿我会在下面给出答案。 【参考方案1】:我只想说没有可靠的方法将 SWF 转换为 MP4。因为SWF-file一般是一个程序。在最简单的情况下,SWF 文件只包含视频(和音频)。 jaygooby、Alfred 和 Aleksey Kontsevich 提供的解决方案非常适合这种情况。
但许多 SWF 文件都包含自己的播放/暂停按钮、音量控件等。当您在 Gnash(或任何播放器)您需要执行其他操作(例如,单击嵌入式 播放 按钮)才能真正开始播放。是的,可以以某种方式自动化这些东西(例如Xvfb
、xdotool
等)。同时那里有很多警告(尤其是音频流)。我什至写了an article about such approach(那是俄语)。
PS1请不要将此答案和后一个链接视为我网站的广告。
PS2 这东西应该作为评论。但由于文本格式,它作为答案发布。
【讨论】:
我已更新 URL,使其指向实际页面而不是网络存档。【参考方案2】:咬牙切齿:
git clone git://git.sv.gnu.org/gnash.git
在构建它之前你需要一堆依赖项(应该能够全部获取):
libsdl-dev
libboost-dev
libagg-dev
然后配置和构建 gnash 视频转储器:
cd gnash
./autogen.sh
./configure --enable-renderer=agg \
--enable-gui=dump \
--disable-menus \
--enable-media=ffmpeg \
--disable-jemalloc
make
然后你可以将 dump-gnash 指向一个 swf,它会渲染出原始视频和音频
dump-gnash -1 \
-D /tmp/out.raw@30 \
-A /tmp/out.wav \
-P "FlashVars=myURL=http://example.com/blah&online=true" \
http://example.com/blah/some.swf \
这将以 30fps(@30
位)和 /tmp/out.wav
写出 /tmp/out.raw
(即 bgra aka rgb32 视频)和 /tmp/out.wav
这些需要重新组合成例如mp4 使用:
ffmpeg -i /tmp/out.wav \
-f rawvideo \
-pix_fmt rgb32 \
-s:v 800x550 \
-r 30 \
-i /tmp/out.raw \
-c:v libx264 \
-r 30 \
-b 160k \
/tmp/out.mp4
因为它的原始视频,ffmpeg 需要知道颜色空间 (rga32) 尺寸和输入 fps。我们告诉它合并音频(160kbps mp3),以 30fps 的速度渲染视频
您需要额外的标志来获得无损 mp4。
【讨论】:
嘿,Jay,这真的很有用!但是,当我这样做时,我发现没有显示背景和文本。知道为什么会这样吗? 可能有多种原因;你知道 swf 是用 AS2 还是 3 构建的?我遇到了一些背景没有渲染的问题,因为一个 swf 正在加载另一个,而电影是两者的组合,gnash 并不总是能正确处理这个问题。 Gnash 现在为 debian-types 添加了依赖项安装程序:deb-attempt-install-dependencies.sh 我无法让这个工具在 mac 上编译。我收到编译错误。 感谢 ***.com/users/102250/jan-larres 对丢失的 .raw
的建议编辑。我无法批准编辑,因为一些审稿人过于热心地拒绝了编辑【参考方案3】:
你可以使用这个脚本:
#!/bin/bash
SWFFILE=$1
MP4FILE=$SWFFILE%.*.mp4
TMPFILE=$(cat /dev/urandom | tr -dc 'a-zA-Z' | fold -w 32 | head -n 1).bin
TMPWAV=$(cat /dev/urandom | tr -dc 'a-zA-Z' | fold -w 32 | head -n 1).wav
TMPMP4=$(cat /dev/urandom | tr -dc 'a-zA-Z' | fold -w 32 | head -n 1).mp4
# create raw-dump
GNASHCMD="dump-gnash -1 -r 3 -v -D $TMPFILE -A $TMPWAV $SWFFILE"
OUTPUT="$(exec $GNASHCMD)"
# extract parameters
WIDTH="$(echo $OUTPUT | grep -o 'WIDTH=[^, ]*' | sed 's/^.*=//')"
HEIGHT="$(echo $OUTPUT | grep -o 'HEIGHT=[^, ]*' | sed 's/^.*=//')"
FPS="$(echo $OUTPUT | grep -o 'FPS_ACTUAL=[^, ]*' | sed 's/^.*=//')"
# create raw, uncompressed mp4 file
mplayer $TMPFILE -vo yuv4mpeg:file=$TMPMP4 -demuxer rawvideo -rawvideo fps=$FPS:w=$WIDTH:h=$HEIGHT:format=bgra
# create compressed mp4 with ffmpeg
ffmpeg -i $TMPMP4 -i $TMPWAV $MP4FILE
# clean up
rm -rf $TMPFILE
rm -rf $TMPMP4
rm -rf $TMPWAV
为我工作!
【讨论】:
我必须在 ffmpeg 的输出之前添加“-strict -2”。由于 swf 中的循环,我还必须为一堆文件手动设置 --max-advances。否则,效果很好。 感谢脚本。我试图转换一个 17mb 的 swf 文件,但它占用了大量的磁盘空间,因为 22gigs 已用完但尚未完成。有什么问题吗? @Bishnu 尝试使用 h264 或 265 编码器或其他方式即时压缩 mp4。好久没用这个脚本了,看看ffmpeg
开关吧。
谢谢。我真的一无所知,我没有mplayer。我使用 slack 和最少的软件包,安装 xurlrunner 时我的空间已经耗尽。【参考方案4】:
OS: Ubuntu (Linux)
我不完全知道这是否无损,但至少我让转换部分正常工作(ffmpeg)。
依赖项
sudo apt-get install ffmpeg swftools
解压
首先我使用swfcombine解压:
swfcombine -d file.swf -o file_new.swf
转换
接下来我使用 ffmpeg 进行转换,这些参数可能不会无损
ffmpeg -i file.swf video.mp4
【讨论】:
这项工作但不会渲染/忽略通过 swfcombine 添加的新资源,如marc.info/?l=swftools-common&m=138732909815669&w=2 中所述 - 您知道如何确保新图像不会被遗漏吗? 视频对我来说都是乱码。 它对我有用sudo apt-get install libav-tools
,而不是如上所示。以上是关于将压缩的 swf 转换为 mp4的主要内容,如果未能解决你的问题,请参考以下文章
使用 AudioConverter 将 PCM 转换为 AAC 并使用 AVAssetWriter 写入 .mp4 文件时音频失真