我最近购买了Synology Diskstation DS412 +,我有很多.mkv电影,我想转换/转码为mp4文件,这样我就可以将它们直接传输到我的XBox 360.我在笔记本电脑上使用Handbrake ,但我宁愿直接在我的NAS上发生这种情况。
我在Linux上非常生疏,不熟悉转码,但我目前的脚本如下:
#!/bin/bash
for dir in *; do
if test -d "$dir"; then
#echo $dir
for file in "$dir"/*.mkv; do
noextension=${file%.*}.mp4
ffmpeg -y -i "$file" -vcodec copy -acodec copy "$noextension"
done
fi
done
根据我的理解,只需复制mkv容器中的音频和视频组件,然后将它们插入到新的mp4容器中。这适用于我的几个文件,但有一些不起作用。
以下是失败运行的输出示例:
ffmpeg version UNKNOWN, Copyright (c) 2000-2011 the FFmpeg developers
built on Sep 16 2013 00:45:02 with gcc 4.2.1
configuration: --prefix=/usr/syno --arch=i686 --target-os=linux --cross-prefix=/usr/local/i686-linux-gnu/bin/i686-linux-gnu- --enable-cross-compile --enable-optimizations --disable-yasm --disable-altivec --enable-pic --enable-shared --disable-static --disable-swscale-alpha --disable-ffserver --disable-ffplay --enable-libmp3lame --enable-libfaac --enable-nonfree --enable-version3 --enable-libopencore-amrnb --enable-libopencore-amrwb --disable-decoder=amrnb --disable-indev=alsa --disable-outdev=alsa --disable-encoder=dca --disable-encoder=ac3 --disable-encoder=ac3_fixed --disable-encoder=ac3_float --disable-encoder=eac3 --disable-decoder=dca --disable-decoder=eac3 --disable-decoder=truehd --cc=/usr/local/i686-linux-gnu/bin/i686-linux-gnu-ccache-gcc
libavutil 50. 40. 1 / 50. 40. 1
libavcodec 52.120. 0 / 52.120. 0
libavformat 52.108. 0 / 52.108. 0
libavdevice 52. 4. 0 / 52. 4. 0
libavfilter 1. 77. 0 / 1. 77. 0
libswscale 0. 14. 0 / 0. 14. 0
[matroska,webm @ 0x80726c0] Estimating duration from bitrate, this may be inaccurate
Seems stream 1 codec frame rate differs from container frame rate: 47.95 (5994/125) -> 23.98 (24000/1001)
...然后是输入章节的开始和结束时间列表,然后......
Stream #0.0(eng): Audio: aac, 48000 Hz, stereo, s16 (default)
Stream #0.1(eng): Video: h264 (High), yuv420p, 1280x692 [PAR 1:1 DAR 320:173], 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc (default)
...然后是输出章节开始和结束时间的列表,然后......
Stream #0.0(eng): Video: ![0][0][0] / 0x0021, yuv420p, 1280x692 [PAR 1:1 DAR 320:173], q=2-31, 2997 tbn, 23.98 tbc (default)
Stream #0.1(eng): Audio: libfaac, 48000 Hz, stereo (default)
Stream mapping:
Stream #0.1 -> #0.0
Stream #0.0 -> #0.1
Press [q] to stop encoding
[mp4 @ 0x808a020] pts < dts in stream 0
av_interleaved_write_frame(): Invalid data found when processing input
XBox支持网站提供了支持的文件类型的详细信息,其中mp4包含在H.264标准中:http://support.xbox.com/ar-SA/xbox-360/system/audio-video-playback
我有点失落。我已经阅读了http://www.ffmpeg.org/ffmpeg.html但是来自ffmpeg的错误消息似乎没有什么帮助,当在Synology Box上运行这些东西时,资源最多是稀疏的。
我尝试了一些我的脚本的排列,例如:
ffmpeg -i "$file" "$noextension"
和
ffmpeg -y -i "$file" -vcodec mpeg4 -acodec libfaac "$noextension"
但是这些都给了我以下错误:
Error while opening encoder for output stream #0.0 - maybe incorrect parameters such as bit_rate, rate, width or height
我认为我需要专门指定输入和输出编解码器,以及比特率或宽高比等,但这是我解开的地方。
非常感谢任何帮助!
答案 0 :(得分:2)
好的,现在实际上需要更详细的视频在转码时失败。但是仍然在查看错误,这是您可以尝试的尝试。我会警告你,输出可能有很多组合(比特率,帧速率等),但你必须决定所有这些。
选项1
ffmpeg -y -i ip.mkv -vcodec libx264 -acodec libvo_aacenc op.mp4
这与ffmpeg -i ip.mkv op.mp4
类似,但我明确添加了编解码器。
选项2
ffmpeg -y -i ip.mkv -vcodec libx264 -acodec libvo_aacenc -b:a 92k op.mp4
添加比特率,您可以根据需要进行更改。
选项3
ffmpeg -y -i ip.mkv -vcodec libx264 -acodec libvo_aacenc -b:a 92k -r 30 op.mp4
添加了30的fps。
您还可以尝试混合2 and 3
选项。
希望这有帮助。欢呼。:)
PS:正如@slhck所说;请先更新ffmpeg,然后尝试这些。所有这些都是re-encoding
命令,所以如果你真的想要它们;使用比我说明的更好的音频编码器。