hadoop + ffmpeg 分布式转码系统实践
一、分割视频:
mkvmerge --split size:32m ./heihu01.mp4 -o ./heihu01.%05d.mp4
mkvmerge --split size:32m ./heihu01.mp4 -o ./heihu01.%05d.mp4
二、hdfs中创建存放分割后视频的目录
八、使用hadoop streaming执行转码
1、编写脚本
2、本地执行测试
hadoop fs -mkdir movies
三、上传分割后的视频
for i in `ls heihu01.*.mp4`; do hadoop fs -put $i movies/; done
for i in `ls heihu01.*.mp4`; do hadoop fs -put $i movies/; done
四、创建mapper输入数据文件路径
hadoop fs -mkdir movies_input
hadoop fs -mkdir movies_input
五、生成mapper数据文件,并上传
cat > mapper_input.sh<<EOF
#!/bin/bash
pwd=\`pwd\`
tmp_file='movies_tmp.txt'
num=2 #TaskTracker数量
true > \${tmp_file}
hadoop fs -rm movies_input/movies_*
for i in \`ls *.[0-9][0-9][0-9][0-9][0-9].*\`;do echo movies/\$i >> \${tmp_file};done
count="\$(wc -l \${tmp_file}|cut -d' ' -f1)"
if [ \$((\$count%\$num)) -eq 0 ];then
rows="\$((\$count/\$num))"
else
rows="\$((\$count/\$num+1))"
fi
split -l \$rows \${tmp_file} movies_
hadoop fs -put movies_[a-z0-9][a-z0-9] movies_input
EOF
chmod +x mapper_input.sh
./mapper_input.sh
六、创建转换后视频的上传路径
hadoop fs -mkdir movies_put
hadoop fs -mkdir movies_put
七、检查Hadoop Streaming的执行身份与工作目录
1、编写脚本
1、编写脚本
cat > test_mapper.sh << EOF
#!/bin/bash
set -x
id="`whoami`"
mkdir -p /tmp/\$id
host=\`hostname\`
pwd=\`pwd\`
uid=\`whoami\`
put_dir='movies_put'
while read line; do
input=\$line
filename=\`basename \$input\`
echo "\$uid@\$host:\$pwd> hadoop fs -get \$input /tmp/\$id/\$filename"
echo "\$uid@\$host:\$pwd> ffmpeg -y -i /tmp/\$id/\$filename -s qcif -r 20 -b 200k -vcodec mpeg4 -ab 64k -ac 2 -ar 22050 -acodec libfaac output-\$filename.3gp"
echo "\$uid@\$host:\$pwd> hadoop fs -put output-\$filename \${put_dir}"
done
rm -rf /tmp/\$id
EOF
chmod a+x test_mapper.sh
#!/bin/bash
set -x
id="`whoami`"
mkdir -p /tmp/\$id
host=\`hostname\`
pwd=\`pwd\`
uid=\`whoami\`
put_dir='movies_put'
while read line; do
input=\$line
filename=\`basename \$input\`
echo "\$uid@\$host:\$pwd> hadoop fs -get \$input /tmp/\$id/\$filename"
echo "\$uid@\$host:\$pwd> ffmpeg -y -i /tmp/\$id/\$filename -s qcif -r 20 -b 200k -vcodec mpeg4 -ab 64k -ac 2 -ar 22050 -acodec libfaac output-\$filename.3gp"
echo "\$uid@\$host:\$pwd> hadoop fs -put output-\$filename \${put_dir}"
done
rm -rf /tmp/\$id
EOF
chmod a+x test_mapper.sh
2、本地执行测试
cat movies_aa |./test_mapper.sh
cat movies_aa |./test_mapper.sh
3、hadoop streaming执行测试
hadoop jar /usr/local/hadoop/contrib/streaming/hadoop-streaming-1.0.2.jar -input movies_input -output movies_output -mapper test_mapper.sh -file test_mapper.sh
hadoop jar /usr/local/hadoop/contrib/streaming/hadoop-streaming-1.0.2.jar -input movies_input -output movies_output -mapper test_mapper.sh -file test_mapper.sh
4、查看hadoop streaming执行结果
hadoop fs -cat /user/$(whoami)/movies_output/part-00000 | head
hadoop fs -cat /user/$(whoami)/movies_output/part-00000 | head
5、删除测试输出
hadoop fs -rmr movies_output #删除测试hadoop streaming的输出
八、使用hadoop streaming执行转码
1、编写脚本
cat > mapper.sh << EOF
#!/bin/bash
id="hduser"
mkdir -p /tmp/\$id
host=\`hostname\`
pwd=\`pwd\`
uid=\`whoami\`
put_dir='movies_put'
cd "/tmp/\$id"
true > a
while read line; do
input=\$line
filename=\`basename \$input\`
echo "\$uid@\$host> hadoop fs -get \$input /tmp/\$id/\$filename"
/usr/local/hadoop/bin/hadoop fs -get \$input /tmp/\$id/\$filename 2>&1
echo "\$uid@\$host> ffmpeg -y -i /tmp/\$id/\$filename -s qcif -r 20 -b 200k -vcodec mpeg4 -ab 64k -ac 2 -ar 22050 -acodec libfaac output-\$filename.3gp"
ffmpeg -y -i /tmp/\$id/\$filename -s 320*240 -r 20 -b 200k -vcodec mpeg4 -ab 64k -ac 2 -ar 22050 -qscale 5 -acodec libfaac output-\$filename.3gp < a 2>&1
/usr/local/hadoop/bin/hadoop fs -put output-\$filename.3gp \${put_dir} 2>&1
echo "\$uid@\$host> hadoop fs -chown \$id \${put_dir}/output-\$filename.3gp"
/usr/local/hadoop/bin/hadoop fs -chown \$id \${put_dir}/output-\$filename.3gp 2>&1
done
rm -f a
rm -rf /tmp/\$id
EOF
chmod a+x mapper.sh
#!/bin/bash
id="hduser"
mkdir -p /tmp/\$id
host=\`hostname\`
pwd=\`pwd\`
uid=\`whoami\`
put_dir='movies_put'
cd "/tmp/\$id"
true > a
while read line; do
input=\$line
filename=\`basename \$input\`
echo "\$uid@\$host> hadoop fs -get \$input /tmp/\$id/\$filename"
/usr/local/hadoop/bin/hadoop fs -get \$input /tmp/\$id/\$filename 2>&1
echo "\$uid@\$host> ffmpeg -y -i /tmp/\$id/\$filename -s qcif -r 20 -b 200k -vcodec mpeg4 -ab 64k -ac 2 -ar 22050 -acodec libfaac output-\$filename.3gp"
ffmpeg -y -i /tmp/\$id/\$filename -s 320*240 -r 20 -b 200k -vcodec mpeg4 -ab 64k -ac 2 -ar 22050 -qscale 5 -acodec libfaac output-\$filename.3gp < a 2>&1
/usr/local/hadoop/bin/hadoop fs -put output-\$filename.3gp \${put_dir} 2>&1
echo "\$uid@\$host> hadoop fs -chown \$id \${put_dir}/output-\$filename.3gp"
/usr/local/hadoop/bin/hadoop fs -chown \$id \${put_dir}/output-\$filename.3gp 2>&1
done
rm -f a
rm -rf /tmp/\$id
EOF
chmod a+x mapper.sh
2、本地执行测试
cat movies_aa | ./mapper.sh
hadoop fs -rm movies_put/* #删除本地执行的遗留文件
3、使用hadoop执行脚本
hadoop jar /usr/local/hadoop/contrib/streaming/hadoop-streaming-1.0.2.jar -input movies_input -output movies_output -mapper mapper.sh -file mapper.sh
4、验证结果
hadoop fs -cat movies_output/part-00000 |head
hadoop fs -ls movies_put
Found 6 items
-rw-r--r-- 3 hduser supergroup 19584280 2012-05-28 13:53 /user/hduser/movies_put/output-heihu01.00001.mp4.3gp
-rw-r--r-- 3 hduser supergroup 14872878 2012-05-28 13:54 /user/hduser/movies_put/output-heihu01.00002.mp4.3gp
-rw-r--r-- 3 hduser supergroup 12052800 2012-05-28 13:55 /user/hduser/movies_put/output-heihu01.00003.mp4.3gp
-rw-r--r-- 3 hduser supergroup 11174014 2012-05-28 13:53 /user/hduser/movies_put/output-heihu01.00004.mp4.3gp
-rw-r--r-- 3 hduser supergroup 15713836 2012-05-28 13:55 /user/hduser/movies_put/output-heihu01.00005.mp4.3gp
-rw-r--r-- 3 hduser supergroup 13084511 2012-05-28 13:56 /user/hduser/movies_put/output-heihu01.00006.mp4.3gp
-rw-r--r-- 3 hduser supergroup 19584280 2012-05-28 13:53 /user/hduser/movies_put/output-heihu01.00001.mp4.3gp
-rw-r--r-- 3 hduser supergroup 14872878 2012-05-28 13:54 /user/hduser/movies_put/output-heihu01.00002.mp4.3gp
-rw-r--r-- 3 hduser supergroup 12052800 2012-05-28 13:55 /user/hduser/movies_put/output-heihu01.00003.mp4.3gp
-rw-r--r-- 3 hduser supergroup 11174014 2012-05-28 13:53 /user/hduser/movies_put/output-heihu01.00004.mp4.3gp
-rw-r--r-- 3 hduser supergroup 15713836 2012-05-28 13:55 /user/hduser/movies_put/output-heihu01.00005.mp4.3gp
-rw-r--r-- 3 hduser supergroup 13084511 2012-05-28 13:56 /user/hduser/movies_put/output-heihu01.00006.mp4.3gp
5、reduce合并视频
cat >reduce.sh <<EOF
#!/bin/bash
tmp_file="movies_tmp.txt"
id="hduser"
pwd=\`pwd\`
pwd=\`pwd\`
dir="/tmp/\${id}_merger"
mkdir \$dir
cd $dir
true > \${tmp_file}
hadoop fs -ls movies_put|awk '{print \$8}'|sed '/^$/d' >> \${tmp_file}
unset m
for i in \`cat \${tmp_file}\`
do
hadoop fs -get \$i \$dir
filename=\`basename \$i\`
if [ ! -z \$m ];then
filename="+\$filename"
fi
echo \$filename >> \$dir/files.txt
m=\$((m+1))
done
mkvmerge -o \$dir/output.3gp \`cat \$dir/files.txt\`
hadoop fs -put \$dir/output.3gp movies_put/
rm -rf \$dir
EOF
chmod +x reduce.sh
6、本地执行测试
./reduce.sh
7、使用hadoop执行脚本
hadoop jar /usr/local/hadoop/contrib/streaming/hadoop-streaming-1.0.2.jar -input movies_input -output movies_output -mapper mapper.sh -reducer reduce.sh -file reduce.sh -file mapper.sh
8、验证结果
hadoop fs -ls movies_put
Found 7 items
-rw-r--r-- 3 hduser supergroup 19584280 2012-05-29 14:15 /user/hduser/movies_put/output-heihu01.00001.mp4.3gp
-rw-r--r-- 3 hduser supergroup 14872878 2012-05-29 14:16 /user/hduser/movies_put/output-heihu01.00002.mp4.3gp
-rw-r--r-- 3 hduser supergroup 12052800 2012-05-29 14:17 /user/hduser/movies_put/output-heihu01.00003.mp4.3gp
-rw-r--r-- 3 hduser supergroup 11174014 2012-05-29 14:15 /user/hduser/movies_put/output-heihu01.00004.mp4.3gp
-rw-r--r-- 3 hduser supergroup 15713836 2012-05-29 14:16 /user/hduser/movies_put/output-heihu01.00005.mp4.3gp
-rw-r--r-- 3 hduser supergroup 13084511 2012-05-29 14:17 /user/hduser/movies_put/output-heihu01.00006.mp4.3gp
-rw-r--r-- 3 hduser supergroup 86175913 2012-05-29 14:17 /user/hduser/movies_put/output.3gp
-rw-r--r-- 3 hduser supergroup 19584280 2012-05-29 14:15 /user/hduser/movies_put/output-heihu01.00001.mp4.3gp
-rw-r--r-- 3 hduser supergroup 14872878 2012-05-29 14:16 /user/hduser/movies_put/output-heihu01.00002.mp4.3gp
-rw-r--r-- 3 hduser supergroup 12052800 2012-05-29 14:17 /user/hduser/movies_put/output-heihu01.00003.mp4.3gp
-rw-r--r-- 3 hduser supergroup 11174014 2012-05-29 14:15 /user/hduser/movies_put/output-heihu01.00004.mp4.3gp
-rw-r--r-- 3 hduser supergroup 15713836 2012-05-29 14:16 /user/hduser/movies_put/output-heihu01.00005.mp4.3gp
-rw-r--r-- 3 hduser supergroup 13084511 2012-05-29 14:17 /user/hduser/movies_put/output-heihu01.00006.mp4.3gp
-rw-r--r-- 3 hduser supergroup 86175913 2012-05-29 14:17 /user/hduser/movies_put/output.3gp
hadoop fs -cat movies_output/part-00000
附:
hadoop streaming 调试
hadoop 的output 中只记录正确输出,因此调试错误需要将命令的输出重定向到正确输出
即在命令后加"2>&1",如:
mkvmerge -o $dir/output.3gp `cat $dir/files.txt` 2>&1
本文出自 “forward” 博客,请务必保留此出处http://nginx.blog.51cto.com/491911/881852
相关推荐
该系统采用Hadoop的MapReduce分布式框架,通过JNI对FFmpeg库的调用,实现了分布式的视频转码。实验结果表明,相比单机版视频转码,分布式视频转码具有明显的优势。 知识点一:Hadoop概述 Hadoop是一个分布式系统...
本文提出了基于Hadoop云计算平台的分布式转码方案,通过整合Hadoop的两个核心组件:HDFS(Hadoop Distributed File System,分布式文件系统)和MapReduce编程模型,实现视频数据的分布式转码。 Hadoop作为一个开源...
在探讨基于Hadoop与FFmpeg的多媒体分布式处理系统设计的过程中,我们可以从几个关键方面来深入分析系统的设计与实施,这些方面包括Hadoop的分布式文件系统(HDFS)、MapReduce编程模型、FFmpeg在多媒体处理上的应用...
为了解决传统单机转码存在的问题,分布式转码系统应运而生,其中Hadoop平台上的视频转码技术尤为突出。 在分布式视频转码系统中,视频资源被存储在HDFS中,利用Hadoop框架的MapReduce编程模型进行视频的分布式转码...
分布式视频转码系统基于Hadoop框架,使用HDFS(Hadoop分布式文件系统)来存储视频文件,并利用MapReduce编程模型封装第三方转码库FFMPEG和MENCODER实现分布式转码。这种方案将视频存储与转码集成到一起,目的是减少...
总结,基于Hadoop和ffmpeg的云转码方案充分利用了分布式计算的优势,实现了大规模视频的高效转码。通过深入理解和实践这些技术,我们可以构建出适应现代需求的云视频服务,满足用户在各种设备和网络条件下的流畅观看...
其次,在视频转码阶段,视频片段通过使用分布式系统Hadoop的MapReduce框架被分配到多个节点上进行并行处理。每个节点使用FFmpeg这一强大的视频处理软件来执行视频转码任务。FFmpeg能够处理多种视频格式,并支持多种...
IaaS层选择了Amazon基础设施云,PaaS层利用Hadoop进行分布式处理,SaaS层运行高性能的视频转码应用程序。其中,文章提出了一种结合FFmpeg和MapReduce技术的优化策略,以实现视频转码的高效运行。 为了提高可扩展性...
4. **存储技术**:包括对象存储和分布式文件系统,如Amazon S3、Hadoop HDFS等,它们能高效地管理和检索大量视频文件。 5. **视频编码与转码**:为了适应不同的设备和网络条件,视频需要进行编码和转码。常见的编码...
在分布式系统中,FFmpeg可以被调用进行大规模的视频转码任务。 在实际操作中,我们需要设置集群环境,配置上述工具,编写脚本或程序来协调各个节点的工作。例如,使用Hadoop的作业提交工具提交MapReduce任务进行...
在处理大量视频文件时,需要注意性能优化,比如通过多线程并行处理,或者使用分布式计算框架如Hadoop或Spark。另外,考虑到存储和网络传输,转码后的文件大小也是需要关注的因素,合理的比特率控制和质量优化可以...
这可能涉及到分布式文件系统,如Hadoop HDFS,或者云存储服务,如阿里云OSS,以确保视频内容的高效存储和快速访问。 3. **视频编码与转码**:为了适应不同设备和网络环境,视频需要进行编码和转码。常见的视频编码...
这可能涉及到分布式存储系统,如Hadoop HDFS或Azure Blob Storage,以确保高可用性和可扩展性。 2. **视频编码与转码**:为了适应不同的网络条件和设备,视频需要进行编码和转码。.NET环境中可以使用FFmpeg库或者...
这里可能涉及分布式存储系统,如 Hadoop 或 Amazon S3。 3. **流媒体服务器**:如 Wowza、Nginx-RTMP 或 FFmpeg,它们负责接收、处理和分发视频流,确保流畅播放。 4. **内容管理系统**:用于组织和管理视频内容,...
这可能包括使用分布式文件系统(如Hadoop HDFS)、云存储服务(如Amazon S3)以及CDN(内容分发网络)来减少延迟,提高访问速度。 总的来说,视频管理网站的建设和运营涵盖了许多IT领域的技术,包括网络传输、文件...
4. **视频处理**:视频上传、转码和播放需要相应的技术支持,如FFmpeg用于视频处理,HLS或DASH协议用于流媒体传输,WebSocket或HTTP长连接用于实时弹幕交互。 5. **推荐算法**:为了实现个性化推荐,项目可能需要...
2. **多媒体数据存储**:视频数据的存储一般采用分布式存储系统,如Hadoop HDFS或Ceph,确保高可用性和可扩展性。服务端需要设计接口与这些系统交互,进行文件的上传、下载、检索和删除操作。 3. **实时流传输**:...
此外,分布式文件系统(如Hadoop HDFS)和云存储服务(如阿里云OSS、AWS S3)也是处理大规模数据存储的有效方案。 #### 1.2 网络传输 文件通过网盘链接提供下载,这意味着用户需要通过互联网获取这些文件。在IT行业...
通常,大型视频网站会选择分布式存储系统来处理海量的数据,如Hadoop HDFS或Amazon S3。前端展示则负责用户交互,包括视频播放、搜索、分类导航等功能,通常采用HTML5、CSS3和JavaScript等技术构建。 其次,爬虫...